1

タイトルがわかりにくかったので、紛らわしいタイトルで申し訳ありません。私はこの機能を持っています:

static void smooth5(IntVector*& v)
{
    IntVector* tmp = new IntVector();
    for(int i=0; i<v->size(); i+=2)
        tmp->push_back(v->at(i));
    delete v;
    v = tmp;
}

そして主に私はこれを行います:

IntVector* v = new IntVector();

v->push_back(0);
v->push_back(1);
v->push_back(2);
v->push_back(3);

smooth5(v);

//print the contents of v

v の内容を印刷すると、出力は 0 2 になります。

IntVector*& v

v がヒープ上のオブジェクトへのポインターであることを意味します。誰か説明してくれませんか?

4

3 に答える 3

3

IntVector*&ポインターへの参照を宣言します。これを関数の引数として使用smooth5すると、呼び出し元の のコピーを変更できますv

に似ていますが、ポインターにポインターを渡すよりも読みやすいです - IntVector**

あなたの例でsmooth5は、呼び出し元を削除し、代わりにその変数IntVectorをポイントします。tmp

于 2013-02-01T15:12:47.170 に答える
1

これは参照へのポインタではなく、ポインタへの参照です。これは、ポインタのコピーを関数に渡す代わりに、参照を渡すことを意味します。その結果、関数内のポインターに加えた変更はsmooth5、この場合はポインターに渡す引数に影響しますv

于 2013-02-01T15:14:39.160 に答える
0

IntVector*& vコードで何を意味するかは、誰がそれを読んでいるかによって異なります。コンパイラがそれを読み取ると、それはvへのポインタへの参照であることを意味しますIntVector(これは?へのtypedef std::vector<int>です)。私がそれを読んだとき、それはおそらくコードの作成者が C++ の仕組みを理解しておらず、適切でない Java または C# のイディオムを適応させようとしているということです。これを書く慣用的な方法は次のようになります。

void smooth5( IntVector& v )
{
    IntVector results;
    for ( int i = 0; i < v->size(); i += 2 ) {
        results.push_back( v[i] );
    }
    v.swap( results );
}

ベクトルへのポインタを含むコードは非常に疑わしいものです。

于 2013-02-01T15:27:36.913 に答える