2

私は C++ が初めてで、現在テンプレートとイテレータについて学んでいます。iteratorカスタム イテレータを実装するコードをいくつか見ましたが、これら 2 つのパラメータの違いを知りたいと思っています。

iterator & operator=(iterator i) { ...   i.someVar }
bool operator==(const iterator & i) { ... i.someVar }

特定の反復子に対して = および == 演算子を実装します。イテレータ クラスにメンバー変数「someVar」があると仮定すると、ある演算子が「イテレータ i」を使用して実装され、別の演算子が「イテレータ & i」を使用して実装されるのはなぜですか? 2 つの「i.someVar」式に違いはありますか?

私は少しグーグルして、この質問を見つけました 配列のアドレス - アンパサンドを持つこととアンパサンドを持たないことの違い

答えは「配列はポインターに変換され、その値は配列の最初のもののアドレスです」でした。これが関連しているかどうかはわかりませんが、私が見つけた唯一の有効な説明のようです.

ありがとうございました!

4

3 に答える 3

3

operator=引数を値 (別名コピー) で受け取ります。operator ==const 参照によって引数を取ります (オブジェクトが変更されないことが保証されていますが、別名アドレスによって)。

イテレータは、配列へのポインタである/含む場合がありますが、それ自体は配列ではありません。

アンパサンド ( &) には、さまざまな文脈上の意味があります。式で使用すると、演算子として動作します。などの宣言で使用され、iterator & i型の一部を形成し、オブジェクトではなく参照であるiterator &ことを示します。i

詳細な説明 (写真付き!) については、C++ の参照渡し / 値および参照渡しと値渡しの違いを参照してください。(これは言語に依存しません)。

于 2013-11-06T00:32:38.670 に答える
2

代入演算子=は反復子 i を値として受け取ります。つまり、元の反復子のコピーが作成されて関数に渡されるためi、演算子メソッド内の反復子に適用された変更は元の反復子に影響しません。

比較演算子==は定数参照を受け取ります。これは、メソッドで元のオブジェクトを変更できない/変更すべきではないことを示します。比較演算子は通常、オブジェクトを変更せずに比較するだけなので、これは理にかなっています。参照により、メソッドの外にある元の反復子への参照を渡すことができます。これは、実際のオブジェクトがコピーされないことを意味します。これは通常、より高速です。

于 2013-11-06T00:37:09.603 に答える
1

まず、ここには配列のアドレスがありません。

ローカル変数にローカルな変更を加えようとしない限り、セマンティックの違いはありません。ローカルな変更は許可されますが、許可iされません。iterator iconst iterator & i

特にが大きくてコピーに費用がかかる場合はconst type & var、参照渡しの方が値渡しよりも高速になる可能性があるため、多くの人が関数パラメーターの記述に慣れていますが、あなたの場合、は小さくてコピーが安価であるべきであるため、コピーを回避してもメリットはありません。 . (実際には、ローカル コピーがあると、参照の局所性が向上し、最適化に役立つため、(コピーによって) 値ごとに小さな値を渡すだけです。)typeiterator

于 2013-11-06T00:32:31.563 に答える