避免使用向量向量进行复制

Tim*_*upe 3 c++ optimization memory-management stl vector

我希望能够拥有某种类型的向量向量,例如:

vector<vector<MyStruct> > vecOfVec;
Run Code Online (Sandbox Code Playgroud)

然后我创建一个MyStruct矢量,并填充它.

vector<MyStruct> someStructs;
// Populate it with data
Run Code Online (Sandbox Code Playgroud)

然后最后添加someStructs到vecOfVec;

vecOfVec.push_back(someStructs);
Run Code Online (Sandbox Code Playgroud)

我想要做的是避免在推送向量时使用复制构造函数调用.我知道这可以通过使用指针向量来实现,但我想尽可能避免这种情况.

我想到的一个策略似乎有效,但我不知道我是否过度设计了这个问题.

// Push back an empty vector
vecOfVec.push_back(vector<MyStruct>());

// Swap the empty with the filled vector (constant time)
vecOfVec.back().swap(someStructs);
Run Code Online (Sandbox Code Playgroud)

这似乎会添加我的矢量而不必做任何副本,但这似乎是编译器在优化过程中已经做的事情.

你认为这是一个好策略吗?

编辑:由于一些建议,简化了我的交换声明.

Pav*_*aev 6

交换技巧与C++ 03一样好.在C++ 0x中,您将能够使用向量的移动构造函数来std::move以更明显的方式实现相同的操作.

另一个选择是不创建一个单独的vector<MyStruct>,而是让代码创建它接受它一个vector<MyStruct>&参数,并对其进行操作.然后,向外部添加一个新的空元素vector<vector<MyStruct>>,并传递对将填充它的代码的引用.