在C ++中:假设我有一个向量const std:vector<MyStruct>
,该向量(及其元素)将不再被修改。现在,我想基于某些谓词过滤此向量并将结果存储在某个对象中,因为我想频繁地遍历此元素子集。
是否有一种很好的方法来避免将MyStructs
从向量复制到另一个向量中,以及如何实现?
答案 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
的奇数值元素的引用,因此不执行任何副本。