将vector <double>推送到vector <vector <double >>

Cam*_*arl 0 c++ compiler-errors vector

所以,我有这种情况:

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);
}
Run Code Online (Sandbox Code Playgroud)

但是,这会产生编译错误,说明:

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>]
Run Code Online (Sandbox Code Playgroud)

我意识到使用向量向量不是性能友好的,但它仍然应该编译和执行,对吗?为什么不呢?

谢谢你的帮助.

Dav*_*eas 8

在表达式中:

myVector[i].push_back(tempVector);
Run Code Online (Sandbox Code Playgroud)

子表达式myVector是a std::vector<std::vector<double>>,myVector[i]是a std::vector<double>&,并且push_back在该向量上需要a double,而不是a std::vector<double>.

看起来你想要设置第i个元素tempVector,如果你应该这样做(假设你tempVector在这个语句之后不需要):

myVector[i].swap(tempVector);
Run Code Online (Sandbox Code Playgroud)

(虽然myVector[i] = tempVector;会产生相同的净效果,但它会更加昂贵,因为它将分配和复制所有内容.swap将内容移动tempVectormyVector[i]几乎没有成本(三个指针交换))

我知道有人会出现并建议使用myVector[i] = std::move(tempVector),这在C++ 11中也很好,但在C++ 03中没有.两者之间的区别在于,在swap原始内容的情况下myVector[i]保证tempVector在操作之后(在这种情况下myVector[i]是空的,所以没关系).另一方面,在标准中未定义tempVectorafter 的状态myVector[i] = std::move(tempVector);,它可以使向量为空,或者可以交换它或...唯一的保证是tempVector移动后对象可以被销毁.