c ++:STL为迭代器使用通用的“end()”值?

时间:2012-06-15 14:00:16

标签: c++ stl iterator

给定STL容器的所有实例的“.end()”迭代器是否指向同一个“过去的”对象?

e.g。

std::set<int> my_set_1;
// fill  "my_set_1"
std::set<int> my_set_2;
// fill  "my_set_2"

bool same_end_iterator  =       my_set_1.end() == my_set_2.end()    ; 

最后一行依赖于实现吗?

3 个答案:

答案 0 :(得分:10)

  

给定STL容器的所有实例的“.end()”迭代器是否指向同一个“过去的”对象?

不,标准不保证这一点,实际上某些容器类型可能不会那样。例如,std::vector::iterator通常实现为指向数组元素的指针,end()指向数组的末尾。

  

最后一行依赖于实现吗?

最后一行给出了未定义的行为。您无法比较来自不同集合的迭代器 - 包括过去的迭代器。

答案 1 :(得分:4)

从概念上讲,每个容器有一个非正式的迭代器 ,并将迭代器与不同的容器进行比较,即使是相同类型的容器,也是UB。

事实上,对于旧式数组,非正式迭代器是a+N,其中a是数组的基础,N是其中元素的数量,这意味着不同阵列的不同的异端迭代器。这也是我能想到的std::vector::iterator最明智的实现。

答案 2 :(得分:1)

对于我的知识,属于不同容器的迭代器的比较是不确定的,我不记得哪个。这相反意味着给定std::vector<int> foo, barfoo.end()bar.end()不同。