0

だから、私はこの状況にあります:

vector<vector<double>> myVector; 
myVector.resize(somePreviousObject.size());
for(int i = 0; i < myVector.size(); i++)
{
    vector<double> tempVector;
    //Do some stuff that fills tempVector, in a loop
    //After loop:
    myVector[i].push_back(tempVector);
}

ただし、これによりコンパイルエラーが発生し、次のようになります。

no matching function for call to 'std:;vector<double, std::allocator<double > >::push_back(std::vector<double, std::allocator<double> >&)'
...stl_vector.h:733 note: candidates are: void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = double, _Alloc = std::allocator<double>]

ベクトルのベクトルを使用することはパフォーマンスにやさしいことではないことを理解していますが、それでもコンパイルして実行する必要がありますか?なんでそうじゃないの?

ご協力いただきありがとうございます。

4

3 に答える 3

8

式では:

myVector[i].push_back(tempVector);

部分式myVectorは、std::vector<std::vector<double>>myVector[i]ありstd::vector<double>&push_backそのベクトルには、doubleではなく、が必要std::vector<double>です。

i番目の要素をに設定したいようです。tempVectorその場合は、(tempVectorこのステートメントの後に必要がないと仮定して)行う必要があります。

myVector[i].swap(tempVector);

myVector[i] = tempVector;正味の効果は同じですが、すべてのコンテンツを割り当ててコピーするため、コストが高くなります。コンテンツをほぼ無料でに移動しますswap3つのポインタースワップ))tempVectormyVector[i]

誰かがやって来て、を使用することを提案することを私は知ってmyVector[i] = std::move(tempVector)います。これはC ++ 11でも問題ありませんが、C++03では使用できません。両者の違いはswap、元の内容の場合、操作後myVector[i]に内部にあることが保証されていることですtempVector(この場合myVector[i]は空なので問題ありません)。一方、tempVectorafterの状態myVector[i] = std::move(tempVector);は標準で定義されていないか、ベクトルを空のままにするか、それを交換するか、または...唯一の保証はtempVector、移動後にオブジェクトが破棄される可能性があることです。

于 2012-10-02T13:43:17.000 に答える
2

どちらか

myVector[i] = tempVector;

また

myVector.push_back(tempVector);

事前にベクターのサイズを変更しているので、最初のバージョンが必要だと思います。

あなたのコードでmyVector[i]は、それ自体がであることに注意してくださいvector<double>。それが機能しない理由です。

于 2012-10-02T13:13:48.877 に答える
0
vector<vector<double>> myVector;  

する必要があります:

vector<vector<double> > myVector;  

その後

myVector[i].push_back(tempVector); 

する必要があります

myVector.push_back(tempVector); 
于 2012-10-02T13:43:22.810 に答える