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

时间:2013-01-29 21:01:14

标签: c++ stl iterator containers 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...
}

3 个答案:

答案 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;
}

http://ideone.com/o18DtQ

  

输出:

0