11

ワーキング ドラフト N3337-1、プログラミング言語 C++ の標準、24.2.5 フォワード イテレータ、806 ページを読む。

下書きから:

2 つの逆参照可能な反復子aおよびb型は、次 のX場合にマルチパス保証を提供します。
a == b++a == ++b
X(void)++X(a), *a*a

[ 注: (入力および出力イテレーターには当てはまらない)ことをa == b意味する要件と、可変イテレーター (出力イテレーターに適用される) を介した代入数の制限の削除により、マルチパスワンパスの使用が許可されます。++a == ++b前方イテレータを使用した方向性アルゴリズム。—終わりのメモ]

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

4

1 に答える 1

16

用語はそれをすべて述べていると思います.シーケンスを複数回通過して、シーケンス内の位置を覚えることができます. シーケンスが変更されない限り、特定の位置 (反復子) から開始して、同じオブジェクトを何度でも同じ順序でトラバースします。ただし、前進することしかできず、後退することはできません。このようなシーケンスの標準的な例は、単一リンク リストです。

引用句は基本的に、等しい比較をする 2 つのイテレータがあり、それらのそれぞれをインクリメントすると、同じ位置に到達し、再び等しく比較されることを示しています。

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

やや奇妙な式++X(a), *aは、基本的に独立したイテレータを進めることを意図しており、基本的に等価aであるという要件は、独立したイテレータを使用してシーケンス上のイテレータが参照するものを変更しないことを意味します。これは、最初の式が位置を変更し、参照している値を無効にしたり変更したりする可能性があるため、必ずしも同等ではない入力反復子とは異なります。++X(a), *a*aa++InIt(a), *a*aa

対照的に、シングルパス シーケンス (標準用語での入力と出力の反復) は 1 回しかトラバースできません。シーケンスを複数回トラバースしようとしても、必ずしもうまくいくとは限りません。このようなシーケンスの標準的な例は、キーボードからの入力とコンソールへの出力です。一度読み取られると、同じ文字を再度取得することはできず、一度送信すると文字を元に戻すことはできません。

于 2013-10-06T19:45:23.490 に答える