所有end()迭代器都是集合类型的等价物吗?

Wil*_*mKF 5 c++ containers iterator stl language-lawyer

给定C++中的特定stl集合,end()相同模板化的所有实例的值是否相等?换句话说,以下是否适用于所有stl容器和环境(不仅仅是std :: map)?

std::map<Key, Value> foo(int seed);

std::map<Key, Value> instance1 = foo(1);
std::map<Key, Value> instance2 = foo(2);
std::map<Key, Value>::iterator itr = instance1.begin();
std::map<Key, Value>::iterator endItr = instance2.end(); // Comes from other collection!

for (; itr != endItr; ++itr) {
  // Do something on each key value pair...
}
Run Code Online (Sandbox Code Playgroud)

Tem*_*Rex 7

不,因为STL容器和迭代器要求:

23.2.1一般容器要求[container.requirements.general]

6 begin()返回一个迭代器,引用容器中的第一个元素.end()返回一个迭代器,它是容器的past-the-end值.如果容器为空,则begin()== end();

24.2.1一般[iterator.requirements.general]

6迭代器j被称为可以从迭代器i中到达,当且仅当表达式++ i的应用程序的有限序列使i == j时.如果j可以从i到达,则它们指的是相同序列的元素.

空容器的相等性begin()end()空容器意味着begin()并且end()需要成为相同容器对象的一部分,因此end()不能是容器类的静态成员.还要注意的是-except正向iterators-应用operator--end()是不可能用静态解析end()迭代器.

  • @mfontanini:我们不能只考虑与"不工作"同义的未定义行为吗?我们每次都要拼写出来吗? (4认同)