※ 引述《clonsey1314 (Clonsey)》之铭言:
: 最近刚接触vector, 很方便, 省了很多初始化的工作
: 程式码也变得简洁多, 也较好维护
: 但是同时也降低的程式的效能(很明显)
: 请问若没有要做太多复杂的增删,是否继续使用array或pointer就好?
: 程式码里同时有vector和pointer/array混杂这样的coding style会不会不好?
: 谢谢
一般在 std::vector 和 C array 间作选择的考量点主要在元素个数的
决定时机: 如果元素个数在编译时期可以决定, 当然使用 C array 或
std::array; 如果只能在执行时期决定, 才需要考虑 std::vector, 但
也不是默认就使用 STL 容器, 端看你的使用情境.
简单举个例子: 假如我们现在需要一块连续内存来储存班上同学的期
末考成绩, 班上同学的数目已知是 50 位, 分数是非负整数, 就可以用
std::array 来定义:
using score_type = unsigned;
std::array<score_type, 50> scores;
然后可能因为效能需求, 或到某个时机点才需要将这块内存配置出来
(lazy initialization), 可以考虑 std::unique_ptr + std::array:
std::unique_ptr<std::array<score_type, 50>> scores;
需要注意的是, 这里和 std::unique_ptr<score_type[]> 的差别在于
元素个数的决定时机, 如果想使用后者, 代码的长相需要像这样:
std::size_t n;
std::cin >> n;
auto scores = std::make_unique<score_type[]>(n);
两者表达的语意完全不一样. 另外 std::vector 虽然简化了物件初始
化及复制, 但其附带的可变长度性质, 也不适合用来描述上面的问题.
所以用什么型别不是问题, 问题是有没有用对型别. 最后整理给你作参
考:
(考虑 owning 语意)
元素个数在编译时期决定:
不需要改变大小: std::array<T, N>
元素个数在执行时期决定:
需要改变大小: STL container
不需要改变大小: std::unique_ptr<T[]>
选用何种 STL 容器就看需要哪些操作 (存取方式、存取成本、新增/删
除元素的位置等..) 假如会在后端以外的地方新增元素, std::vector
就不是好的选择.