在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...
}
答案 0 :(得分:7)
不,因为STL容器和迭代器要求:
23.2.1一般容器要求[container.requirements.general]
6 begin()返回一个迭代器,引用该中的第一个元素 容器。 end()返回一个迭代器,它是一个过去的结束值 对于容器。如果容器为空,则begin()== end();
24.2.1一般[iterator.requirements.general]
6迭代器j从迭代器i调用,当且仅当 表达式++ i有一个有限的应用序列 使i == j。如果j可以从i到达,则它们指的是 相同的顺序。
空容器的begin()
和end()
相等意味着begin()
和end()
需要成为同一容器对象的一部分,因此end()
不能是容器类的静态成员。另请注意,除了正向迭代器之外 - 在operator--
上应用end()
将无法使用静态end()
迭代器解析。
答案 1 :(得分:2)
一般来说,不,那是不便携的。它可能在某些平台上巧合。
有可以重复使用的终结迭代器用于不同的范围,例如默认构造的istream_iterator:
ifstream a("foo.txt");
ifstream b("bar.txt");
istream_iterator<string> end;
istream_iterator<string> ia( a);
istream_iterator<string> ib( b);
// from here on both [ia, end> and [ib, end> are valid ranges.
答案 2 :(得分:0)
亲自尝试:
#include <map>
#include <iostream>
using namespace std;
map<int,int> m1;
map<int,int> m2;
int main() {
cout<<(m1.end() == m2.end())<<endl;
}
输出:
0