我看到這個的方式,它們都具有相同的功能,除了std :: vector看起來更加靈活,所以何時需要使用數組,並且可以使用std ::只有矢量? 這不是一個新問題,原來的問題沒有我一直在尋找我應該使用std :: vector而不是數組
回答
一個有趣的事情是,當迭代器將與載體很多功能失效,即不能與數組的情況。注意:std::swap
與std::array
迭代器仍然會指向同一個點。
詳見: http://en.cppreference.com/w/cpp/container/array
陣列的優點很好的總結: https://stackoverflow.com/a/4004027/7537900
這一點似乎最有趣:
固定大小的數組可被直接嵌入到一個結構或對象, 它可以改善內存的局部性並減少堆的數量 需要的分配
沒有測試過,我不確定這是真的。
這裏是關於2D向量VS陣列其對在代碼廚師競爭編程的討論: https://discuss.codechef.com/questions/49278/whether-to-use-arrays-or-vectors-in-c
顯然存儲器是不是在2個維度中的2D矢量,僅在一個維度連續的,然而,在二維它是數組。
當使用std答案:向量,唯一的性能影響是當達到容量,爲內存必須搬遷到容納在堆上
因此,這裏在連續的存儲器空間物體的較大數量是兩者在問候靈活性和性能的總結:
的std ::陣列;重新分配是不可能的,因此堆內存的重新定位不會導致性能下降。
std :: vector;只有超過容量並重新分配時纔會影響性能。您可以使用保留(大小)來粗略估計您需要的最大對象數量。與std :: array相比,這允許更大的靈活性,但當然,如果超過保留空間,則必須重新分配內存。需要注意的
作爲一個經驗法則,你應該使用:
- 一個std ::陣列如果在編譯時固定
- 大小一個std ::向量是大小不固定在編譯時
- 在他們的第一元件的地址的指針是需要低級別的訪問
- 如果要實現一個(非標準)的原陣列容器
個標準集裝箱必須知道它們的大小,即使您將它們傳遞給其他的功能,什麼生數組不的能力,並有足夠的東西在C++代碼永遠不會使用原始陣列沒有具體原因。其中一個可能是需要低級別優化的瓶頸,但是隻有在確定瓶頸之後才能進行分析。而且您應該在真實條件下進行基準測試,以確定標準容器是否實際增加了過載。
唯一的好理由,我能想到的是,如果你實現一個特殊的容器。作爲標準集裝箱並不意味着導出,你只有兩種選擇,要麼有你的類包含一個標準集裝箱,並最終在一個容器中含有與各代表團的容器中無處不在,或模擬標準集裝箱(從井複製代碼知道實現),並專門化它。在這種情況下,您會發現自己直接管理原始數組。
- 1. 我應該使用std :: move函數返回std :: vector嗎?
- 2. 我應該返回gsl :: span <const T>而不是const std :: vector <T>&
- 3. 我應該使用std :: vector +我自己的size變量嗎?
- 4. C++併發寫入數組(而不是std :: vector)bools
- 5. 取得std :: vector的總和是使用引用而不是值?
- 6. 我應該在明確給出數字時引用std :: vector size
- 7. std :: vector bad_alloc不使用push_back
- 8. 應該std :: vector榮譽alignof(value_type)?
- 9. 只有使用std :: string而不是char數組和std :: vector/list而不是C++中的數組有什麼實際限制嗎?
- 10. std :: vector構造函數 - 爲什麼int而不是int *?
- 11. 應該boost :: ptr_vector在所有的時間使用std :: vector嗎?
- 12. 錯誤,而繼承std :: vector
- 13. std :: vector不保留數據?
- 14. 我應該公開受保護的std :: vector嗎?
- 15. 我應該擔心與std :: vector的內存碎片?
- 16. 我應該用漆而不是nginx嗎?
- 17. 我應該總是在構造函數中使用std :: move嗎?
- 18. 我應該如何支持 - 初始化std :: pairs的std ::數組?
- 19. 使用std :: lower_bound與std :: vector :: const_iterator
- 20. 使用strcpy與std :: vector
- 21. 我也應該使用numpy.float64而不是Python float當使用numpy.array
- 22. std :: vector ::使用相同參數擦除
- 23. 將靜態數組推入std :: vector?
- 24. std :: vector覆蓋最終值,而不是增長?
- 25. 我如何知道參數應該是一個對象而不是數組?
- 26. iterate std :: vector <std :: vector <char>>?
- 27. 我可以將std :: vector <Animal*>轉換爲std :: vector <Dog*>而不必查看每個元素?
- 28. 使用std :: vector來動態分配2d數組?
- 29. 使用std :: vector作爲可更改的完全填充數組?
- 30. 二維數組邊界檢查使用std :: vector和.at()
如果需要一個 「動態」 數組,則['的std :: VECTOR'](http://en.cppreference.com/w/cpp/container/vector)是天然溶液。它通常應該是所有事物的默認容器。但是如果你想在編譯的時候(比如C風格的數組)創建的,但包裹在一個很不錯的C靜態大小的數組++對象然後['標準:: array'(http://en.cppreference.com/w/cpp/container/array)可能是更好的選擇。 –
當你不需要'std :: vector'的靈活性時,使用一個數組(或'std :: array')是明智的。 – molbdnilo
動態內存,堆? –