12

*it++サンプル コードでは、出力イテレータなどのコードをよく見かけます。この式*it++は のコピーを作成しit、インクリメントitしてから、最終的に逆参照されるコピーを返します。私が理解しているように、出力イテレータのコピーを作成するとソースが無効になります。itしかし、コピーを作成した後に実行されるインクリメントは違法ですよね? 出力イテレータに関する私の理解に問題はありますか?

4

5 に答える 5

16

標準では*r++ = t、出力反復子 (24.1.2) で動作する必要があります。機能しない場合は、標準の定義による出力反復子ではありません。

そのようなステートメントが内部で正しく機能することを確認するのは、反復子の実装次第です。

出力反復子の複数のコピーを保持してはならない理由は、単一パスのセマンティクスがあるためです。イテレータは、各値で 1 回だけ参照解除できます (つまり、参照解除操作ごとにインクリメントする必要があります)。イテレータが逆参照されると、そのコピーを逆参照することはできません。

これが機能する理由*r++ = tです。元の反復子のコピーが作成され、元の反復子が逆参照され、コピーがインクリメントされます。元の反復子は二度と使用されず、コピーは同じ値を参照しなくなります。

于 2010-10-22T23:06:23.320 に答える
7

式は、コピーを作成したり、インクリメントしたり*it++しません(する必要はありませ) 。この式は、通常のセマンティクスに従うため、便宜上のみ有効です。operator=実際の仕事をするだけです。たとえば、ostream_iteratoroperator*operator++およびの g++ 実装では、 1 つのことoperator++(int)だけを行います(つまり、何もしません!)。たとえば、次のように記述できます。return *this

it = 1;
it = 2;
*it = 3;
++it = 4;

それ以外の:*it++ = 1; *it++ = 2; *it++ = 3; *it++ = 4;

于 2010-10-23T12:52:17.293 に答える
1

出力イテレータは通常のイテレータのようには機能せず、ポインタのような式 ( *it++ = x) で使用して有用な結果が得られるようにインターフェイスが指定されています。

通常、operator*()operator++()およびoperator++(int)すべての戻り値*thisは参照として返され、出力イテレータoperator=には、予想される出力操作を実行する魔法があります。出力イテレータから読み取ることができないためoperator*()、他のイテレータのように機能しないなどの事実は問題ではありません。

于 2010-10-22T23:04:42.563 に答える
1

あなたのコメントを見ると、ほとんどの混乱は SGI のドキュメントから生じているように思われます。

出力反復子をコピーしても、コピーされた反復子は無効になりません。実際の制限は非常に単純です。出力反復子の特定の値を一度だけ逆参照する必要があります。ただし、一度に 2 つのコピーを持っていても、それらが同じ値を持っている間に 1 回だけ参照解除する限り問題ありません。一方を逆参照してからその値を破棄し、もう一方をインクリメントしますが、インクリメントが発生した後にのみ逆参照する場合は、すべて完全に問題ありません。

于 2010-10-22T23:37:25.907 に答える
-4

イテレータは単なるポインタではありませんか? インクリメントしてから逆参照すると、次の要素に移動します。

于 2010-10-22T22:56:01.257 に答える