如何过滤或"grep"C++向量?

And*_*eas 8 c++

我有一个vector<MyType>并希望另一个vector<MyType>只包含满足一些简单标准的MyTypes,例如某些数据成员等于某些东西.解决这个问题的最佳方法是什么?

Ker*_* SB 17

用途copy_if:

#include <algorithm>  // for copy_if
#include <iterator>   // for back_inserter

std::vector<MyType> v2;
std::copy_if(v1.begin(), v1.end(), std::back_inserter(v2),
             [](MyType const & x) { return simple_citerion(x); } );
Run Code Online (Sandbox Code Playgroud)

  • @EitanT:你可以通过反转谓词来滥用C++ 03的`remove_copy_if`. (4认同)
  • 该死的,10秒!+1 (2认同)
  • 但重要的是要注意`copy_if`仅在C++ 11中,对吧? (2认同)

seh*_*ehe 7

使用一点Boost,你可以:

std::vector<int> v = {1,2,-9,3};

for (auto i : v | filtered(_arg1 >=0))
    std::cout << i << "\n";
Run Code Online (Sandbox Code Playgroud)

此示例使用Phoenix作为由expression template(_arg1 >= 0)定义的隐式lambda ,但您可以使用任何可调用的(C++ 03或更高版本)和Boost适配器(fitlered,transformation,reverse等)

请参阅此处了解更多展示材料和完整示例: