3

特定の STL コンテナーのすべてのインスタンスの ".end()" イテレーターは、同じ "past-the-end" オブジェクトを指していますか?

例えば

std::set<int> my_set_1;
// fill  "my_set_1"
std::set<int> my_set_2;
// fill  "my_set_2"

bool same_end_iterator  =       my_set_1.end() == my_set_2.end()    ; 

最後の行は実装依存ですか?

4

3 に答える 3

10

特定のSTLコンテナのすべてのインスタンスの「.end()」イテレータは、同じ「過去の」オブジェクトを指しますか?

いいえ、標準はそれを保証するものではなく、実際には、一部のコンテナタイプはおそらくそのように機能しません。たとえば、std::vector::iterator通常は配列要素へのポインタとして実装され、配列end()の終わりを超えてポイントされます。

最後の行は実装に依存していますか?

最後の行は未定義の動作を示しています。過去のイテレータを含む、さまざまなコレクションのイテレータを比較することはできません。

于 2012-06-15T14:02:20.003 に答える
4

概念的には、コンテナーごとに1つのオフザエンドのイテレーターがあり、同じタイプのイテレーターであっても、イテレーターを異なるコンテナーに比較するのはUBです。

実際、古い学校のアレイの場合、オフザエンドイテレータは、がアレイのベースであり、がその中の要素の数であるa+N場所です。つまり、アレイごとに異なるオフエンドイテレータがあります。これは、私が考えることができる最も賢明な実装でもあります。aNstd::vector::iterator

于 2012-06-15T14:01:45.030 に答える
1

私の知る限り、異なるコンテナに属するイテレータの比較は定義されていません。どれを思い出せません。これは、与えられた が と同じstd::vector<int> foo, barではないことを意味します。foo.end()bar.end()

于 2012-06-15T14:04:23.530 に答える