5

同じ型の std::iterator が 2 つある場合、同じオブジェクト (クラスではない) からのものかどうかをどのようにテストできますか? 注意してください、私はそれらの値を比較する方法を尋ねているわけではありません.

std::string foo = "foo";
std::string bar = "bar";

std::string::iterator iter1 = foo.begin();
std::string::iterator iter2 = bar.begin();

if ( iter1 == iter2 )
{
    ...
}

上記は失敗するはずであり、実際に失敗します。実行時にこれを確認するにはどうすればよいですか? ソース コードを調べると、関連するメソッド コールが必要なiterator::_Compat()チェックを行う void メソッドであることがわかりますが、失敗するとデバッグ アサーションが発行されます。これは、リリース ビルドでは見過ごされます。

さらに見てみると、イテレータ (少なくとも文字列の場合) には public_GetCont()メソッドがあることがわかります。そう

if ( iter1._GetCont() == iter2._GetCont() )

動作します。しかし、これは文書化されていないため、安全に使用できないと私は信じています。

私の質問は、上記を移植可能な方法でどのように達成できるかということです。

また、これは反復子テンプレート クラスの一部です。2 番目の反復子を制御することはできません。

4

2 に答える 2

8

私の質問は、上記を移植可能な方法でどのように達成できるかということです。

それはいけません。

一般に、イテレーターは、それが指しているコンテナーについて知る (または知らせる)必要はありません。イテレータはポインタの一般化であり、必要なのはポインタのように振る舞うことだけです。

そのため、カテゴリに応じて、逆参照、インクリメント、デクリメント、合計などを許可する場合がありますが、C++ 標準には、ユーザーがどのコンテナーを指しているか、または同じコンテナーを指しているかどうかをユーザーに知らせるイテレーター要件はありません。別のイテレータとして。

つまり、反復子範囲の有効性は、その反復子範囲で機能する関数の前提条件である必要があります。提供された反復子が同じコンテナーを指していることを確認するのはクライアントの責任です (そして、2 番目の反復子が最初の反復子から到達可能であること)。

たとえば、標準ライブラリがこの問題をどのように扱っているかを次に示します (C++11 標準のパラグラフ 24.2.1/7)。

データ構造を操作するライブラリのアルゴリズム テンプレートのほとんどには、範囲を使用するインターフェイスがあります。範囲は、計算の開始と終了を指定する反復子のペアです。範囲[i,i)は空の範囲です。一般に、範囲[i,j)とは、 が指す要素から始まり、 が指す要素までのデータ構造内の要素を指します。iただし、 が指す要素は含まれませんj。範囲は、 から到達可能[i,j)な場合にのみ有効です 。ライブラリ内の関数を無効な範囲に適用した結果は未定義です。ji

于 2013-07-05T15:22:52.550 に答える