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 反復子 j は、i == j となる式 ++i の適用の有限シーケンスがある場合にのみ、反復子 i から到達可能であると呼ばれます。j が i から到達可能な場合、それらは同じシーケンスの要素を参照します。

空のコンテナのbegin()とが等しいということは、 と が同じコンテナ オブジェクトの一部である必要があることを意味します。したがって、コンテナ クラスの静的メンバーになることはできません。また、前方反復子を除いて、適用は静的反復子で解決できないことにも注意してください。end()begin()end()end()operator--end()end()

于 2013-01-29T21:02:08.637 に答える
2

一般に、いいえ、それは移植性がありません。一部のプラットフォームでは偶然にも機能する場合があります。

デフォルトで構築された istream_iterator など、さまざまな範囲で再利用できるend-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 に答える