2012-10-02 128 views
0

所以,我有这样的情况:推矢量<double>到矢量<矢量<double>>

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

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

感谢您的帮助。

回答

8

在表达式:

myVector[i].push_back(tempVector); 

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

看起来你要设置的个元素是tempVector,如果这是你应该做的情况下(对,你不这样语句后需要tempVector的假设):

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]是空的,所以它无关紧要)。另一方面,myVector[i] = std::move(tempVector);之后的tempVector的状态在标准中未定义,它可以将向量留空,或者可以交换它或......唯一的保证是移动之后可以销毁对象tempVector

+0

我认为利用'swap'来进行常量值的赋值(在这种情况下,你想放弃源代码)可以很好地隐藏在析构函数中执行swap()的小助手对象中。像'container_update > tmp(myVector [i]);'它在内部维护一个std :: vector ,并在'tmp'对象超出范围时立即用myVector [i]交换它。 –

+0

@FrerichRaabe:我明白你的意思,但我不同意。代码应该清楚它的功能。如果操作比较复杂,我会加一个帮手,但是我认为没有意义。另外请注意'swap'有其他副作用('tmpVector'变化),看看这个函数调用可能并不明显。最后,我会发现通过完全删除代码并使用引用可以更容易地阅读:'std :: vector &tempVector = myVector [i];'(但这意味着即使旧分配行没有达到) –

+0

啊啊,我觉得真的很傻。我将坚持使用C++ 03交换方法而不是C++ 11移动,因为我无法保证用户基础将具有C++ 11。感谢帮助! –

2

这是不是

myVector[i] = tempVector; 

myVector.push_back(tempVector); 

既然你调整你的载体事先,我假设你想要的第一个版本。

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

+0

最大的可能是,他居然想'myVector [我] .swap(tempVector)' ... –

+0

@DavidRodríguez-dribeas之前从未使用过。比'='好吗? –

+0

它不会分配空间并将所有内容从'tempVector'复制到'myVector [i]',而是移动内容(即没有内存分配,没有副本,只有三个指针交换)。看到我的答案。 –

0
vector<vector<double>> myVector; 

应该是:

vector<vector<double> > myVector; 

然后

myVector[i].push_back(tempVector); 

应该

myVector.push_back(tempVector); 
+0

第一个区别取决于编译器。 C++ 11使该语法有效,所以我们不能再让VS接受无效的语法。 –

相关问题