![](/img/trans.png)
[英]Is it safe to use std::vector.erase(begin(), end()) or std::vector.erase(begin(), begin())?
[英]why is begin() needed in std::vector erase?
為什么我們要編寫v.erase(v.begin(), v.begin()+3)
?
為什么它不被定義為erase(int, int)
所以你可以編寫v.erase(0,2)
並且實現負責begin()
s?
接口container.erase(iterator, iterator)
更通用,適用於沒有索引的容器,如std::list
。 如果您編寫模板並且不確切地知道代碼要處理哪個容器,這是一個優勢。
原始設計旨在盡可能通用,迭代器比索引更通用。 設計人員可以為vector
添加額外的基於索引的重載,但決定不這樣做。
在STL中,迭代器是唯一提供對STL容器的一般訪問的實體。
可以通過指針和索引訪問數組數據結構。 迭代器是這些索引/指針的泛化。
可以使用移動指針訪問鏈接列表(la ptr = ptr->next
)。 迭代器是對這些的泛化。
Trees和HashTables需要特殊的迭代器類,它封裝了迭代這些數據結構的邏輯。
如您所見,迭代器是一般類型,它允許您對數據結構執行常見操作(如迭代,刪除等),而不管它們的底層實現如何。
這樣,您可以重構代碼以使用std::list
和container.erase(it0, it1)
仍然可以在不修改代碼的情況下工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.