给定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() ;
最后一行依赖于实现吗?
答案 0 :(得分:10)
给定STL容器的所有实例的“.end()”迭代器是否指向同一个“过去的”对象?
不,标准不保证这一点,实际上某些容器类型可能不会那样。例如,std::vector::iterator
通常实现为指向数组元素的指针,end()
指向数组的末尾。
最后一行依赖于实现吗?
最后一行给出了未定义的行为。您无法比较来自不同集合的迭代器 - 包括过去的迭代器。
答案 1 :(得分:4)
从概念上讲,每个容器有一个非正式的迭代器 ,并将迭代器与不同的容器进行比较,即使是相同类型的容器,也是UB。
事实上,对于旧式数组,非正式迭代器是a+N
,其中a
是数组的基础,N
是其中元素的数量,这意味着不同阵列的不同的异端迭代器。这也是我能想到的std::vector::iterator
最明智的实现。
答案 2 :(得分:1)
对于我的知识,属于不同容器的迭代器的比较是不确定的,我不记得哪个。这相反意味着给定std::vector<int> foo, bar
,foo.end()
与bar.end()
不同。