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