爲什麼C++中沒有pop_front
方法std::vector
?爲什麼在C++ std :: vector中沒有pop_front方法?
回答
由於std::vector
沒有關於在前面插入元素的特殊功能,不像其他容器。每個容器提供的功能對該容器有意義。
你也許應該使用一個std::deque
,這是明確好在在前面和背部插入。
檢查this diagram了。
因爲push_back
和pop_back
是隻需要計算O(1)
矢量的特殊操作。任何其他推動或流行需要O(n)
。
這不是一個「bug」或「怪癖」,這只是矢量容器的屬性。如果您需要快速pop_front,請考慮更改爲其他容器。
但是,如果你需要一個pop_front和不在乎在向量元素的指數,你可以做種一個pop_front喜歡的東西
template<typename T>
void pop_front(std::vector<T>& vec)
{
vec.front() = vec.back();
vec.pop_back();
}
丹希金斯談到這也:https://youtu.be/oBbGC-sUYVA?t=2m52s
這將是一個奇怪的情況,你們都做了,不關心元素的順序。因爲如果你真的不在乎,這更簡單:template
您的評論似乎對我來說不對。通過做'template
另外,如果你想操縱連續的內存緩衝區,可能會發生在不深入關注元素順序時使用矢量。我不爭論這是否是一個好主意,但在這個非常具體的(和指定的)情況下,它是在O(1)中做一個'pop_front'的有效方法。 – marchelbling 2014-11-02 10:45:15
載體通常被實現是這樣的:
struct
{
T* begin; // points to the first T in the vector
T* end; // points just after the last T in the vector
int capacity; // how many Ts of memory were allocated
};
「begin」作爲「指向矢量中第一個T的指針」和「指向我們分配的所有內存的指針」的雙重任務。因此不可能通過簡單地遞增「開始」來「彈出」離開矢量前面的元素 - 這樣做,並且不再有指向您需要釋放的內存的指針。那會泄漏記憶。所以「pop_front」需要將所有的Ts從矢量的後面複製到矢量的前端,這相對較慢。所以他們決定放棄標準。
你想要的東西是這樣的:
struct
{
T* allocated; // points to all the memory we allocated
T* begin; // points to the first T in the vector
T* end; // points just after the last T in the vector
int capacity; // how many Ts of memory were allocated
};
這一點,你可以在「pop_front」移動「開始」前後沒有遺忘的危險內存後解除分配這。爲什麼不std :: vector這樣工作?我想這是寫這個標準的人的口味問題。他們的目標可能是提供儘可能簡單的「可動態調整大小的陣列」,我認爲他們可以成功。
簡單。請嘗試:
vec.erase(vec.begin());
- 1. 爲什麼沒有在gcc-4.9.1-4ubuntu2中手動輸入std :: vector?
- 2. 爲什麼std :: hash沒有在C++ 0x中爲std :: weak_ptr定義?
- 3. std :: set和std :: vector有什麼區別?
- 4. 爲什麼std :: vector和std :: array的C++ initializer_list行爲不同?
- 5. 爲什麼std :: cin.getline沒有采用std :: string的oveloaded方法?
- 6. 爲什麼C++ 11中沒有vector(size_type n,const Allocator&alloc)?
- 7. 爲什麼std :: vector :: front有兩個定義? (C++)
- 8. 在C++中釋放std :: vector指針的正確方法是什麼?
- 9. 爲什麼沒有std :: on_exit?
- 10. 爲什麼沒有std :: inplace_merge_unique?
- 11. sizeof()std :: vector(C++)
- 12. C++ std :: vector作爲std :: function的參數
- 13. 爲什麼在C++ 17中沒有std :: future :: then?
- 14. 爲什麼std :: string沒有大寫/小寫,格式等方法?
- 15. C++ std :: vector <std :: shared_ptr>
- 16. 爲什麼在C#中沒有用於Rectangle類的Center()方法?
- 17. 爲什麼我不能將PictureBox ^存儲在std :: vector中?
- 18. 爲什麼begin()在std :: vector中需要擦除?
- 19. 爲什麼GLSurfaceView.Renderer中沒有onSurfaceDestroyed方法?
- 20. 爲什麼不是std :: string是std :: vector的專門化?
- 21. 有沒有辦法將std :: vector <const T*>轉換爲std :: vector <T*>而無需額外分配?
- 22. 什麼時候有人將std :: vector定義爲thread_local?
- 23. 爲什麼std :: vector :: push_back具有虛擬析構函數的segfaults?
- 24. 連接兩個std :: vector - 哪種方法更高效,以及如何/爲什麼?
- 25. C++中真正的空std :: vector是什麼?
- 26. C++ 17中的std :: vector演繹指南是什麼?
- 27. 什麼是boost :: ptr_vector :: pop_front()返回類型?
- 28. 爲什麼有兩種方法可以迭代Vector,IntoIterator和Iter?
- 29. 爲什麼C#中的SortedList沒有Find方法?
- 30. 什麼是std :: vector :: front()用於?
具體來說,如果您需要快速的'pop_front()',考慮更改爲'std :: deque <>'。 – ildjarn 2011-04-06 09:15:44
「僅需要O(1)計算」 - 在「push_back」情況下分攤爲O(1),最壞情況是由於您尚未預留空間而必須重新分配時的Theta(n)。 – 2011-04-06 09:15:47
因爲用戶正在談論爆裂,所以我在本例中省略了分配。不過你是對的。 – orlp 2011-04-06 09:17:34