2009-07-27 11 views
11

C++標準では、デフォルトで構築された2つのSTLイテレータを比較できるはずだと言っていますか?デフォルトで構築されたイテレータは等価であるか?例えばデフォルト構築イテレータと演算子==

私はSTDを使用して、次のことをしたい::リスト:

void foo(const std::list<int>::iterator iter) { 
    if (iter == std::list<int>::iterator()) { 
     // Something 
    } 
} 

std::list<int>::iterator i; 
foo(i); 

私はここにしたい何がイテレータのためのNULL値のようなものですが、私はそれが合法だかはわかりません。 Visual Studio 2008に含まれているSTL実装では、std :: listの演算子==()にアサーションが含まれています。 (各イテレータは同じコンテナによって所有されており、デフォルトのイテレータにはコンテナがないことを確認します)。これは合法ではない、あるいはおそらく過度に熱心であることを示唆します。

+0

'boost :: optional 'が気になります。 – MSalters

答えて

15

いいえ、私は刺すでしょう。 C++標準、セクション24.1/5:

イテレータも 任意のコンテナに関連付けられていない特異 値を有することができます。 [例: の初期化されていない ポインタxの宣言(int * x;と同様)の後には、xは のポインタの値を持つと常に仮定されなければなりません。 ]ほとんど 式の結果は単数では定義されていません 値;唯一の例外は、 に非特異値を代入し、単数の 値を保持するイテレータです。

いいえ、それらは比較できません。

+0

ニース、あなたはそれを持っています:) – AraK

+0

'std :: istream_iteratorはどうでしょうか?それはまさにあなたが終わりのためにテストを比較する方法です。 –

1

の範囲をこの関数に渡す必要があります。

void fun(std::list<int>::iterator beg, std::list<int>::iterator end) 
{ 
    while(beg != end) 
    { 
     // do what you want here. 
     beg++; 
    } 
} 
+1

おそらく真ですが、質問には答えません。 –

+0

うん、ちょうど私の2セント:) – AraK

+1

私はあなたが言っていることを理解していますが、セマンティクスは実際には単一のアイテムを必要とします - std :: list :: erase()とよく似ています。私はイテレータの概念を乱用しているかもしれません。それが私が発見に興味を持っているものです。 – Adrian

1

仕様では、デフォルトのコンストラクタの事後条件はイテレータがsingularであるということです。等価性の比較は定義されていないため、実装によっては異なる場合があります。

6

これはC++ 14で変更される予定です。 【forward.iterators] N3936の24.2.5p2が

言うしかし、値初期化イテレータを比較することができ、同じタイプの他の値に初期化イテレータに等しい を比較しなければなりません。

+0

私は仕事で何かを実装するときにこの時点でヒットしました:(私はC++ 2014を持っていましたが、ビジュアルスタジオ2012を持っていればいいと思っていました:D –

+0

これはC + + 14でもよくないアイデアです。値が初期化されたイテレータと比較されます。 –