如何在STL容器中实现end()?

时间:2010-09-28 06:46:29

标签: c++ stl

因此,当我们需要从头到尾遍历容器时,我们会编写类似

的内容

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

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

我的问题是“什么保证结尾总是指向容器中最后一个元素的一个?” STL如何确保这种行为,这种情况是否有可能不正确?

6 个答案:

答案 0 :(得分:22)

STL通过始终存储这样的东西来确保这种行为:

vector

最后(双关语),end() 并不重要,只要它总是end()(并且,显然,不能与任何其他节点混淆。)

答案 1 :(得分:3)

stl规范保证结尾将是一个结尾 See here 。情况总是如此。它究竟是如何做的这可能取决于实现(例如,有时值只是设置为null),但只要v是一个有效的指针,你就可以放心,你的循环就可以了。

答案 2 :(得分:3)

C ++ 03章节23.1/7

  

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

     

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

     

如果容器为空,则为begin() == end();

答案 3 :(得分:2)

“end将始终指向容器中最后一个元素之后的一个”意味着如果增加指向最后一个元素的迭代器,它将等于end()的结果。实施可以有所不同。在Visual C ++ std::vector::end()中返回保存零指针的特定于实现的迭代器。

答案 4 :(得分:1)

你问的是所有的STL容器......没有提到vector特别是end()可能的实现,正如你显而易见的那样。在std :: map<&gt ;?中结束的是什么? “结束是最后一个使用的节点之后”的事情只是一个逻辑概念,表示您可以安全地从最后使用的节点增加,将它与/或“抽象”概念区分开来,并做一些节点算术,其中end被认为比最后使用的节点更远。不要太过于字面意思。

答案 5 :(得分:0)

正如之前的一些海报所说,end()是一个过去的结尾元素。如果需要通过迭代器访问最后一个元素,请使用iter = container.end() - 1;否则,对于向量,variable = someVector.back();假设该变量属于someVector包含的数据类型。

关于它指向最终的保证,容器本身在内部处理。你必须像对待任何其他对象一样对待它,并相信它能正确地做到这一点。

每当调整容器大小时,它将跟踪结束位置,并在您再次访问end()之前保持最新状态。但是,根据容器的不同,如果你有一个迭代器并以某种方式改变它,它可能会使迭代器失效并破坏你的迭代过程。