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是 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);

(虽然myVector[i] = tempVector;具有相同的净效果,但它会更昂贵,因为它会分配和复制所有内容。这swap将几乎免费将内容移入(三个指针交换tempVectormyVector[i]

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

于 2012-10-02T13:43:17.000 回答
2

要么是

myVector[i] = tempVector;

或者

myVector.push_back(tempVector);

由于您事先调整了矢量的大小,我假设您想要第一个版本。

在您的代码中,请记住它myVector[i]本身就是 a 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 回答