通过移动将向量附加到另一个(前C++ 11)

7 c++ move stdvector

我正在处理一些相对较大的整数向量,我有一个顶级向量,我需要累积其他(临时)向量的结果.

将它扩展到原地很遗憾,因为我收到了从另一个API预先烹饪的临时向量,并且由于同样的原因我坚持使用GCC 4.1.2,所以没有一个很好的移动语义或std :: move of C++ 11.

目前我正在使用insert进行复制,例如:

vector<int> accumulator;
for(){
    vector<int> tempVector = vectReturningFunction();
    ...
    if(!tempVector.empty()){
        accumulator.insert(accumulator.end(), tempVector.begin(), tempVector.end());
    }
}
Run Code Online (Sandbox Code Playgroud)

由于临时常规是一次性的,数据可以足够大,我希望能够移动而不是复制,但我无法找到一种优雅的方式来做到这一点.

任何解决方案甚至只是指针(没有双关语意图)在一个有用的方向将非常感激.几年前,我对Stroustrup前C++ 11读取配方有一个模糊的记忆,可以跨越STL容器,但是现在有很多C++ 11的东西,没有多少搜索服务.

谢谢.

Jur*_*aho 3

您也无法在 C++11 中移动矢量内容。移动语义仅适用于向量的元素,但对于元素来说int没有任何好处。你想要的只是不可能的。但如果你想避免合并,你可以存储向量的向量:

vector< vector<int> > accumulator;
accumulator.reserve(expectedCount); // reserve some space so that you avoid copying contents on vector resizing.
for(/*...*/){
    accumulator.resize(accumulator.size()+1); // make space for a new vector
    vectReturningFunction().swap(accumulator.back()); // just swap no copy of the vector
}
Run Code Online (Sandbox Code Playgroud)

这完全取决于您想用累加器做什么。如果您确实需要一个vector<int>,那么在最后合并向量可能仍然比将它们逐一附加更便宜。