7

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

遗憾的是,扩展它不是一个选择,因为我收到了从另一个 API 预先制作的临时向量,并且出于同样的原因我被 GCC 4.1.2 困住了,所以没有任何好的移动语义或 std::move C++11。

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

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

由于 temp 通常是一次性的,并且数据可能足够大,我希望能够移动而不是复制,但我无法找到一种优雅的方式来做到这一点。

任何解决方案,甚至只是指向有用方向的指针(没有双关语)都将不胜感激。我也有一个模糊的记忆,多年前阅读 Stroustrup pre C++11 的食谱,以跨 STL 容器移动,但是这些天周围有很多 C++11 的东西,没有提供多少搜索服务。

谢谢。

4

2 回答 2

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
}

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

于 2013-09-13T06:47:43.433 回答
2

避免复制数据(和重新分配)的唯一方法,特别是不使用 C++11,是累积到 a 中vector<vector<int>>

std::vector<std::vector<int>> accumulator;
for(){
    // C++03
    accumulator.resize(accumulator.size()+1);
    vectReturningFunction().swap(accumulator.back()); // Juraj
    if(accumulator.back().empty())
        accumulator.resize(accumulator.size()-1);
    // C++11
    // auto temp = vectReturningFunction();
    // if(!temp.empty())
    //     accumulator.push_back(std::move(temp));
}
于 2013-09-13T06:56:04.580 回答