3

理解しようとしている (コメントされていない...) ソース ファイルがあります。

static const Map *gCurMap;
static std::vector<Map> mapVec;

それから

auto e = mapVec.end();
auto i = mapVec.begin();
while(i!=e) {
    // ...
    const Map *map = gCurMap = &(*(i++));
    // ...
}

私は何を理解して&(*(i++))いません。を使用するだけではコンパイルされませんi++が、「インクリメント」しているため、同じように見えます。i次に、指定されたアドレスで値を要求し、次にこの値のアドレスを要求しています?!

4

4 に答える 4

4

全くない。&*xは と同じでoperator&(operator*(x))、何でもかまいません。

と同じであるようなポインタ型にのみ当てはまります。しかし、C++ にはユーザー定義型とオーバーロード可能な演算子があります。T * p&*pp

逆参照演算子 ( *) は通常、反復子がコンテナー要素への参照を返すようにオーバーロードされます。&コンテナー要素に対するアンパサンド演算子 ( ) の効果は、クラスの作成者次第です。無条件にアドレスを取得したい場合は、std::addressof(*i++)(from your favorite header <memory>) を使用する必要があります。

于 2012-12-18T22:50:15.420 に答える
3

mapVec.begin()オーバーロードされた を持つイテレータを返しますoperator++operator*イテレータの「逆参照」(オーバーロード)は、mapオブジェクトに到達することです。参照&は、まあ、mapはポインターであるため、 の逆参照からオブジェクトのアドレスに割り当てられていますii++実際のmapオブジェクトではなく、イテレータのままであるという理由だけではできません。

于 2012-12-18T22:52:14.637 に答える
2

iは反復子、*iはその反復子が指すオブジェクト、 はそのオブジェクト&*iのアドレスです。イテレータが単純な古いポインターである場合、これは不要ですが、通常はそれほど単純ではありません。operator*多くの場合、イテレータは、それが指しているオブジェクトにアクセスできるようにオーバーロードするクラス型です。したがって、これは基本的に、イテレータから要素への変換、そしてその要素へのポインタへの変換です。

インクリメントを次の行に移動すると、指定された行がわかりにくくなるだけです。i++の値がちょうどiで、インクリメントが後で発生するため、これは同等です。

于 2012-12-18T22:53:28.403 に答える
2

同じではありませんi。イテレータです。イテレータを逆参照すると、何らかのオブジェクトへの参照が生成されます。つまり、T&何らかのタイプのTです。このようなオブジェクトのアドレスを取得すると、 が得られますT*。つまり、ロケーション にあるオブジェクトのアドレスですi。イテレータも同じ式でインクリメントされることは単なる詳細であり、悪い考えである可能性があります (通常、ポスト インクリメントはプレインクリメントよりも効率が悪く、コードの抜粋でイテレータをポスト インクリメントする必要はありません: それも可能です)他の場所で事前にインクリメントされます)。

于 2012-12-18T22:53:51.587 に答える