Re: [问题] 是否使用vector?

楼主: poyenc (发箍)   2019-02-02 01:39:08
※ 引述《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
就不是好的选择.
作者: ilikekotomi (Young)   2019-02-02 13:40:00
感谢整理与分享
作者: tomsawyer (安安)   2019-02-02 18:02:00
题外话 请问如何存取vector string里面的字符?
作者: achicn3 (Sher)   2019-02-02 18:22:00
s1[0][0]这样吧?楼上
作者: tomsawyer (安安)   2019-02-02 18:57:00
我试试看 谢谢楼上
作者: allensheng (上将帽子)   2019-02-03 01:43:00
最近的文都太专业了吧
作者: leoloveivy (cried)   2019-02-03 19:42:00
刚转回C/CPP版真D没让我失望XDDD 推个

Links booklink

Contact Us: admin [ a t ] ucptt.com