2011-09-19 56 views
2

什麼會有更好的性能,stl向量或動態數組,每次我只是想重新添加一些東西時就重新分配?C++容器性能問題

會使用vectors :: iterator會更快,然後使用for循環的數組?

如果有人能解釋爲什麼,那會很好。

回答

3

什麼會有更好的性能,STL向量或動態數組,只是每次我想添加一些東西時,它只是realloc'd?

Stl的載體具有插入在分期常量時間(因爲重新分配沒有完成所有的時間和保留由因子1.5(最小)發生)。

因此,根據你的描述,載體會比大量重新分配所有的時間快

將使用矢量::迭代更快然後陣列上使用for循環?

在一般情況下:完全相同。 但是,某些STL實現會在調試模式下生成檢查,這會顯着減慢容器迭代器的使用。

(注意:大多數實現實現矢量/串迭代器作爲的typedef value_type*

如果有人可以解釋爲什麼,那將是巨大的。

+0

好吧,可以說我即將與結構一起工作,並且我有一個結構向量。如果我想添加一個項目,id必須首先創建結構,然後用push_back將它推回去?如果我有一個數組,我可以將項目分配給數組。這是否會使陣列更快或者沒有? – Josh

+0

@Josh:您可以調整矢量大小,然後寫入新創建的房間。這完全等同於C方法。現在,使用C++ 11,你可以擁有你的蛋糕並吃掉它,因爲push_back使用移動構造/賦值生成完全相同的語義。移動構造函數/賦值操作符通常會爲您的Pod類型自動生成。 ([background](http://en.wikipedia.org/wiki/C%2B%2B11#Rvalue_references_and_move_constructors)) – sehe

+0

@sehe:C++ 11也有'emplace_back',這比移動構造更令人興奮。 –

1

速度沒有區別,但vector更加安全。這是因爲函數只會被編譯器內聯,但是vector會攜帶大量的異常和邊界檢查(如果您要求),在使用自己的原始數組時,您不會看到這些異常和邊界檢查。

2

什麼會有更好的性能,STL向量或動態數組,只是每次我想添加一些東西時,它只是realloc'd?

STL vector應該是在這種情況下的贏家,因爲它不ReAlloc如果時間[矢量擔保O(1)攤銷插入時間。但是,如果您的malloc實現針對這種用法進行了優化,則它可能會相似。

會使用vectors :: iterator會更快,然後使用for循環的數組?

這些應該是相同的,特別是因爲vector :: iterator通常只是指向數組或其精簡包裝的指針。

6

不成熟的優化是邪惡的。標準C++的做事方式是儘可能使用標準庫容器。如果你想用最好的容器適合您的需要:這裏是圖

STL diagram for choosing containers

來源:Original Image by Jameson Williams

有一天,你將可能需要大量優化,並使用動態數組,但它應該很少見......有一天,你還需要集合是多線程安全的......等等......但一般情況下std容器是要走的路。

+0

你從哪裏得到這張圖?我很想在我的牆上放一個大的原始尺寸。 – datalost

+1

這一個來自http://i.stack.imgur.com/d5CDK.png ...如果你做一個谷歌搜索stl或std容器的選擇,你應該找到圖像一樣。 –

+1

這張圖看起來不對我。如果回答「是」以「在前面插入/擦除」,則會詢問您是否需要合併集合,而不是您是否需要查找第n個元素。如果兩個問題的答案都是「是」,那麼'deque'和'list'之間的選擇應該取決於這兩個操作的相對頻率*成本。在某些情況下,這個圖表會讓你使用'list',因爲你做了很多次找到第n個元素,所以'deque'總體上會更快。 –