2013-10-06 9 views
8

読書ワーキングドラフトN3337-1、標準的なプログラミング言語C++の、24.2.5フォワードイテレータ、ページドラフトから806C++ ISO規格に準拠したマルチパス保証とは何ですか?

二dereferenceableイテレータaとタイプのbX提供マルチパス保証を場合: - a == b++a == ++b
意味 -
Xをポインタ型または発現(void)++X(a), *a発現*aと等価です。

[注意:++a == ++b(入力イテレータと出力イテレータには当てはまりません)を意味し、可変イテレータ(アウトプットイテレータに適用)による割り当て数の制限を取り除くという要件は、フォワードイテレータを用いたマルチパス1方向アルゴリズムの使用。 -end note]

誰かがこれを簡単な言葉で再解釈できますか?フォワード・イテレーターはマルチパスであることを理解していますが、C++の標準要件ごとにこれがどのように達成されるのか分かりません。

+1

+1特定のプログラミング問題に対処していない場合でも、実際にはC++標準を読むのが難しい場合があるため、このコミュニティには適しているためです。 – LihO

答えて

13

これらの用語は、私が考えていることです:シーケンスを複数回通過させ、シーケンス内の位置を記憶することができます。シーケンスが変更されない限り、特定の位置(イテレータ)から開始すると、同じオブジェクトを同じ順序で必要なだけ頻繁にトラバースします。しかし、あなたは前に進むことができます、後ろに移動する方法はありません。このようなシーケンスの標準的な例は、単一リンクされたリストです。

引用された句基本的には同じ比較2回の反復子を持っており、あなたがそれらの一つ一つをインクリメントした場合、あなたは同じ位置に着くと、彼らは再び同じ比較することを、こう述べています。

if (it1 == it2) { 
    ++it1; 
    ++it2; 
    assert(it1 == it2); // has to hold for multi-pass sequences 
} 

やや奇妙な表現++X(a), *a基本的にaとは独立したイテレータを進めることを意図しており、が*aに相当するという要件は、基本的に独立したイテレータを使用してシーケンスを反復することによってaが何も変わらないことを意味する。これは、最初の式が位置を変更する可能性があり、おそらくaを無効にしたり、参照している値を変更したりする可能性があるため、++InIt(a), *aが必ず*aと同じでない入力イテレータとは異なります。対照的に、シングルパスシーケンス(標準の入力と出力の反復)は、一度しかトラバースできません。シーケンスを複数回トラバースしようとすると必ず動作するわけではありません。このようなシーケンスの標準的な例は、キーボードから入力され、コンソールに出力されます。一度読み込むと、同じ文字をもう一度返すことはできません。一度送信すると、その文字を元に戻すことはできません。

関連する問題