将矢量<double>推到矢量<矢量<double>上>

Pushing vector<double> onto vector<vector<double>>

本文关键字:lt gt double 矢量      更新时间:2023-10-16

所以,我有这样的情况:

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

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

谢谢你的帮助。

在表达式中:

myVector[i].push_back(tempVector);

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

看起来您想要将i第th个元素设置为tempVector,如果是这样的话(假设在该语句之后不需要tempVector):

myVector[i].swap(tempVector);

(虽然myVector[i] = tempVector;将具有相同的净效果,但它将更昂贵,因为它将分配和复制所有内容。swaptempVector的内容移动到myVector[i]中,几乎不需要任何成本(三指针交换))

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

它要么是

myVector[i] = tempVector;

myVector.push_back(tempVector);

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

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

vector<vector<double>> myVector;  

应该是:

vector<vector<double> > myVector;  

然后

myVector[i].push_back(tempVector); 

应该是

myVector.push_back(tempVector);