如何在不复制的情况下将过滤向量的结果存储在另一个向量中
How would one store the result of filtering a vector inside another vector without copying
在 C++ 中:假设我有一个向量 const std:vector<MyStruct>
,它(及其元素)将不再被修改。现在我想根据一些谓词过滤这个向量并将结果存储在某个对象中,因为我想经常迭代这个元素子集。
是否有避免将 MyStructs
从矢量复制到另一个矢量的好方法,如何做到这一点?
这甚至可以使用普通的 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
的奇数值元素,因此不执行任何复制。
在 C++ 中:假设我有一个向量 const std:vector<MyStruct>
,它(及其元素)将不再被修改。现在我想根据一些谓词过滤这个向量并将结果存储在某个对象中,因为我想经常迭代这个元素子集。
是否有避免将 MyStructs
从矢量复制到另一个矢量的好方法,如何做到这一点?
这甚至可以使用普通的 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
的奇数值元素,因此不执行任何复制。