6

给定 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...
}
4

3 回答 3

7

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

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

6 begin() 返回一个指向容器中第一个元素的迭代器。end() 返回一个迭代器,它是容器的结束值。如果容器是空的,那么 begin() == end();

24.2.1 一般 [iterator.requirements.general]

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

begin()空容器和空容器的相等end()意味着begin()end()需要是相同容器对象的一部分,因此end()不能是容器类的静态成员。还要注意 - 除了前向迭代器 - 应用operator--onend()将无法使用静态end()迭代器解决。

于 2013-01-29T21:02:08.637 回答
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.
于 2013-01-29T21:16:38.900 回答
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
于 2013-01-29T22:18:28.707 回答