一个人如何在不复制的情况下将过滤一个向量的结果存储在另一个向量中

时间:2019-02-03 16:10:10

标签: c++ stdvector

在C ++中:假设我有一个向量const std:vector<MyStruct>,该向量(及其元素)将不再被修改。现在,我想基于某些谓词过滤此向量并将结果存储在某个对象中,因为我想频繁地遍历此元素子集。

是否有一种很好的方法来避免将MyStructs从向量复制到另一个向量中,以及如何实现?

1 个答案:

答案 0 :(得分:3)

即使使用普通的STL,也可以使用很少的标准类型来完成此操作,reference_wrapper是特别重要的一种:

#include <iostream>
#include <vector>
#include <functional>
#include <iterator>
#include <algorithm>

int main() {
    std::vector<int> cv{0, 1, 2, 3, 4, 5};
    std::vector<std::reference_wrapper<int>> fv;
    std::copy_if(cv.begin(), cv.end(), std::back_inserter(fv)
        , [](int x){ return x % 2; });
    for(auto const &v: fv) std::cout << v << '\n';
    std::cout << "-----\n";
    cv[3] = 42;
    for(auto const &v: fv) std::cout << v << '\n';
}
$ g++ meow.cpp && ./a.out 
1
3
5
-----
1
42
5

请注意cv中的更改如何反映在fv中。 fv仅存储对原始元素的引用,即对cv的奇数值元素的引用,因此不执行任何副本。