2017-04-04 47 views
3

爲什麼我們要寫v.erase(v.begin(), v.begin()+3)爲什麼begin()在std :: vector中需要擦除?

爲什麼不把它定義爲erase(int, int)所以你可以寫v.erase(0,2)和執行照顧begin() s?

+0

,因爲整個工程STL迭代器,它是方便易,因爲如果你想以後改變向量列出,你就不需要更改代碼,如果你使用迭代,沒有這樣的運氣與詮釋。 –

回答

6

接口container.erase(iterator, iterator)更通用,適用於沒有索引的容器,如std::list。如果您編寫模板並且不確切知道代碼要處理哪個容器,這是一個優勢。

最初的設計目的是儘可能通用和迭代器比指標比較一般。設計師可能添加額外的指數型重載vector,但決定不。

+0

此外,迭代器可能來自''函數,並且_those_返回索引將非常緊縮。 –

1

在STL中,迭代器是提供對STL容器一般訪問的唯一實體。

的陣列可以通過指針和索引來訪問。迭代器是這些索引/指針的泛化。
鏈接列表可以通過移動指針來訪問(a la ptr = ptr->next)。迭代器是對這些的泛化。
Trees和HashTable需要特殊的迭代器類,它封裝迭代這些數據結構的邏輯。

正如你所看到的,迭代器是普通型,它允許你對數據結構做常見的操作(如重複,缺失等),不論其底層的實現。

這樣,您可以重構代碼以使用std::listcontainer.erase(it0, it1),但仍可以在不修改代碼的情況下使用。

相關問題