3

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

例如

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()    ; 

最后一行是否依赖于实现?

4

3 回答 3

10

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

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

最后一行是否依赖于实现?

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

于 2012-06-15T14:02:20.003 回答
4

从概念上讲,每个容器都有一个终端迭代器,并且将迭代器与不同容器(即使是相同类型的容器)进行比较是 UB。

实际上,对于老式数组,off-the-end 迭代器是数组的基数,是a+N其中元素的数量,这意味着不同的数组有不同的 off-the-end 迭代器。这也是我能想到的最明智的实现。aNstd::vector::iterator

于 2012-06-15T14:01:45.030 回答
1

据我所知,属于不同容器的迭代器的比较是未定义的,我不记得是哪个。这反而暗示了给定的std::vector<int> foo, bar,foo.end()不等于bar.end()

于 2012-06-15T14:04:23.530 回答