将vector <double>推送到vector <vector <double>&gt; </vector <double> </double>

时间:2012-10-02 13:13:05

标签: c++ vector compiler-errors

所以,我有这种情况:

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>]

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

感谢您的帮助。

3 个答案:

答案 0 :(得分:8)

在表达式中:

myVector[i].push_back(tempVector);

子表达式myVectorstd::vector<std::vector<double>>myVector[i]std::vector<double>&,而该向量上的push_back需要double,而不是std::vector<double> tempVector

看起来你想将 i -th元素设置为tempVector,如果是这种情况你应该这样做(假设你不需要{{ 1}}在此声明之后):

myVector[i].swap(tempVector);

(虽然myVector[i] = tempVector;具有相同的净效果,但它会更昂贵,因为它会分配和复制所有内容。swap移动内容tempVector进入myVector[i]几乎没有任何费用(三指针交换))

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

答案 1 :(得分:2)

要么是

myVector[i] = tempVector;

myVector.push_back(tempVector);

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

在您的代码中,请记住myVector[i]本身就是vector<double>,这就是它无效的原因。

答案 2 :(得分:0)

vector<vector<double>> myVector;  

应该是:

vector<vector<double> > myVector;  

然后

myVector[i].push_back(tempVector); 

应该是

myVector.push_back(tempVector);