2016-11-22 24 views
2

這適用於保留我選擇的max_size下的向量長度,並且我無法使其與我的測試斷開,但它是限制向量大小的方法嗎?維護一個最大尺寸的向量?

if (vector.size() >= max_size) { 
    vector.erase(vector.begin()); 
    } 

它是一個撤銷/重做狀態,所以我只想保留在內存中的有限數量的狀態。

+1

只要你只有一個線程,就不可能一次添加多個項目,而且在迭代時你不需要做,是的。關閉主題:考慮使用['std :: deque'代替。](http://en.cppreference.com/w/cpp/container/deque)它應該有更好的性能,但它不會連續記憶。 – user4581301

+3

查看[boost :: circular_buffer](http://www.boost.org/doc/libs/1_62_0/doc/html/circular_buffer.html)。正如你已經指出的那樣,你描述的是一個* ring *或者* circular buffer *,即使你沒有意識到它。 – PaulMcKenzie

+0

好的,謝謝你,我會研究這些選項。這是一個相當小的集合,有50個8字節的類型,並且可以以用戶點擊輸入的最大速度進行訪問,但是如果可以的話,優化可能是一種很好的做法。 – Kebtiz

回答

2

這種方法將工作(假設您一次添加一個元素),但它不會很快。 std::vector類型針對最終的插入和刪除進行了優化,而不是開始,並且如果您在std::vector中有大量元素,則刪除第一個元素的成本可能很高。如果你保留一個大的緩衝區,最好使用std::deque,它在前端和末端進行刪除優化(恰好就是你的用例)。

對於什麼是值得的,你可能想查找這是一種長期的「循環緩衝區」,它是你邏輯上談論的那種數據結構。

1

如果std::vector增加不止一個元素被調用之前你的方法,你的方法只刪除一個元素,如果std::vector較大的max_size這種方法是行不通的。

以下代碼將根據std::vector中有多少額外元素來刪除一系列元素。

if (vector.size() >= max_size) 
{ 
    auto elements_to_erase = (vector.size() - max_size) + 1; 
    vector.erase(vector.begin(), vector.begin() + elements_to_erase); 
} 
+1

這是添加到矢量的唯一方法的第一部分,所以我不認爲我會遇到該問題,但我會考慮到將來的矢量使用。 – Kebtiz