【发布时间】:2009-12-11 18:37:40
【问题描述】:
我希望能够拥有某种类型的向量,例如:
vector<vector<MyStruct> > vecOfVec;
然后我创建一个 MyStruct 的向量并填充它。
vector<MyStruct> someStructs;
// Populate it with data
然后最后将 someStructs 添加到 vecOfVec;
vecOfVec.push_back(someStructs);
我想要做的是避免在推送向量时调用复制构造函数。我知道这可以通过使用指针向量来完成,但如果可能的话,我想避免这种情况。
我想到的一个策略似乎可行,但我不知道我是否过度设计了这个问题。
// Push back an empty vector
vecOfVec.push_back(vector<MyStruct>());
// Swap the empty with the filled vector (constant time)
vecOfVec.back().swap(someStructs);
这似乎可以添加我的向量而无需进行任何复制,但这似乎是编译器在优化期间已经在做的事情。
你认为这是一个好策略吗?
编辑:根据一些建议简化了我的交换语句。
【问题讨论】:
-
为什么不想只存储指针?
-
小问题:你可以调用 vecOfVec.back().swap(someStructs)。
-
将你的代码移动到一个
move函数中,我认为它很好,它看起来有点像C++0x:template <typename Cont> void move(Cont& pContainer, typename Cont::value_type& pValue){ pContainer.push_back(typename Cont::value_type()); pContainer.back().swap(pValue);}这个函数将数据移动到一个容器的后面通过交换。未经测试:P
标签: c++ optimization memory-management stl vector