2015-06-09 44 views
6

我一直在運行一個C++程序來達到科學目的,我現在正在考慮優化它。C++容器在添加元素到最後非常有效

瓶頸似乎是一個函數,我需要堆棧對整數。他們的編號從一開始就不可能知道,而且我一直在使用一個定製結構的std::vector,它擁有兩個ints。是否有一個更有效的數據容器在最後重複添加元素?我應該使用兩個ints而不是一對或自定義結構嗎?

編輯: 在對我的程序進行計時和分析後,我可以說,對於我的使用,vectordeque稍快(僅增加3%)。我的外行人的結論是,CPU充分利用了數據的連續性。優化比以往任何時候都更適合我!對於它可能會有所幫助:通過從STL C++ 11隨機數生成器切換到BOOST,我實際上顯着改善了運行時間。

+2

相關:http://stackoverflow.com/questions/471432/in-which-scenario-do -i-use-a-particular-stl-container – EdChum

+0

一個快速的'std :: list' – Bastien

+4

你如何訪問數據?你需要從前面,後面或者中間訪問它嗎?此信息對確定要使用的容器很重要。 –

回答

10

您必須做的重新分配的對數數量的成本是可以說是無關緊要的。但是,您可以考慮使用保證O(1)插入前端和後端的std::deque。你會失去連續性,但一些緩存友好保存。一個deque通常是一個體面的權衡,特別是如果你需要從前面流行。

也考慮估計向量將存儲的元素的數量,並使用reserve。但要小心,不要浪費太多的記憶,否則你會得到相反的效果。

+2

對此的一個很好的研究:http://www.codeproject.com/Articles/5425/An-In-Depth-Study-of-the-STL-Deque-Container – norisknofun

+1

感謝您的建議,我將基準和看到如果有改善。儘管我有關於調用預留的問題,但後來我意識到我不知道最終大小的分佈或平均值,並且使用非常大的值在計時時效率低下。非常感謝!! –

+1

請記住也要遵循@KerrekSB的建議,即儘可能重用該向量。 – gd1

2

正如gd1所提到的,std::deque(雙端隊列)允許在兩端快速插入和刪除。另外,在deque的任一端插入和刪除都不會使指針或引用無效。

你的情況,例如,你可以使用std::dequestd::pair(在<utility>定義),以滿足您的需求:

// Small example: 
deque<pair<int, int>> deq; 
deq.push_back({1234, 4321}); 
cout << deq.at(0).first << " " << deq.at(0).second; 

// using 'at' above, should normally be inside a try block as it may throw 
// out_of_range exception 
相關問題