簡體   English   中英

如何在STL容器中實現end()?

[英]How is end() implemented in STL containers?

因此,當我們需要從頭到尾遍歷容器時,我們會寫出類似的內容

for (i = v->begin(); i != v->end(); i++)

假設i是容器v的迭代器。

我的問題是“什么保證結束總是指向容器中最后一個元素的一個?” STL如何確保這種行為,這種情況是否有可能不正確?

STL通過始終存儲這樣的東西來確保這種行為:

向量

最后(雙關語),無論end() 什么,只要它總是end() (顯然,不能與任何其他節點混淆)。

stl規范保證結束將是一個結束看到這里 情況總是如此。 它究竟是如何做的這可能取決於實現(例如,有時值只是設置為null),但只要v是一個有效的指針,你就可以放心,你的循環就可以了。

C ++ 03第23.1/7節說

begin()返回一個引用容器中第一個元素的迭代器。

end()返回一個迭代器,它是容器的past-the-end值。

如果容器為空,則begin() == end() ;

“end將始終指向容器中最后一個元素的一個”意味着如果增加指向最后一個元素的迭代器,它將等於end()的結果。 實施可以有所不同。 在Visual C ++中, std::vector::end()返回包含零指針的特定於實現的迭代器。

你問的是所有的STL容器......沒有提到vector特別是end() 可能會被實現,因為你顯然是直覺所期望的。 在std :: map <>中結束的是什么? “結束是最后一個使用的節點之后”的事情只是一個邏輯概念,表示您可以安全地從最后使用的節點增加,將它與/或“抽象”概念區分開來,並做一些節點算術,其中end被認為比最后使用的節點更遠。 不要太過於字面意思。

正如之前的一些海報所說的那樣, end()是一個過去的結尾元素。 如果需要通過迭代器訪問最后一個元素,請使用iter = container.end() - 1; 否則,在vector的情況下, variable = someVector.back(); 假設變量是someVector包含的數據類型。

關於它指向最終的保證,容器本身在內部處理。 你必須像對待任何其他對象一樣對待它,並相信它能正確地做到這一點。

每當容器調整大小時,它將跟蹤結束的位置,並且在您再次訪問end()之前將是最新的。 但是,根據容器的不同,如果你有一個迭代器並以某種方式改變它,它可以使迭代器無效並破壞你的迭代過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM