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)
不,因为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()
迭代器.