0

私はC++でベクトルを扱っていますが、よくわからない次のMWEを思いつきました:

#include <iostream>  
#include <vector>

using namespace std;

vector<double> pb()
{
    vector<double> a;
    a.push_back(1);
    a.push_back(2);
    a.push_back(3);
    return a;
}

int main()
{
    vector<double> asd;
    asd = pb();
    cout << asd.size() << endl;

    asd = pb();
    cout << asd.size() << endl; //WHY DOES THIS GIVE 3, AND NOT 6? asd HAS NOT BEEN EMPTIED AT ANY POINT


    return 0;
}

理解できないのは、asdを呼び出すたびにベクトルが「初期化」される理由pb()です。私が期待していたのは、呼び出しpb()が単に の内容に追加されることでしasdた。

4

3 に答える 3

2

毎回「初期化」されるわけではありません。3 つの項目を含む関数呼び出しの結果で再割り当てされます。再割り当てされると、古い内容は破棄されます。

追加する場合appendは、再割り当てではなくメンバー関数を使用してください。または、関数への参照を渡し、新しいベクトルではなく、それに追加します。

于 2013-03-22T15:56:56.263 に答える
2

この関数pbでは、新しいベクターを作成し、それに 3 つのアイテムをプッシュしてから、それを返します。asb次に、関数にコピーされmain、古いコンテンツが削除されます。

pb関数は、ベクトルに追加する必要があることをどのように認識しますか? そうではありません。代わりに関数に渡す必要があります。

void pb(std::vector<double>& a)
{
    // Push back items...
}

int main()
{
    std::vector<double> asd;

    pb(asd);

    // ...
}

ご覧のとおり、ベクトルを返さないように関数を変更しました。代わりに、参照引数として渡されます。

于 2013-03-22T15:56:41.873 に答える
1

簡単に言えば、これはあなたが望む答えを与えるはずです:

vector<double> pb(vector<double> &a)
{
    a.push_back(1);
    a.push_back(2);
    a.push_back(3);
}

int main()
{
    vector<double> asd;
    pb( asd );
    cout << asd.size() << endl;

    pb( asd );
    cout << asd.size() << endl; //WHY DOES THIS GIVE 3, AND NOT 6? asd HAS NOT BEEN EMPTIED AT ANY POINT

    return 0;
}

より長い話:pb()提示されたコードの元のバージョン を呼び出すたびに、新しい を作成し、 std::vectorその新しい にプッシュしましたvectorpb()返された後、asdは追加されるのではなく、新しく作成された & 塗りつぶされた に割り当てられvectorます。

于 2013-03-22T15:57:09.953 に答える