【问题标题】:How to filter or "grep" a C++ vector?如何过滤或“grep”一个 C++ 向量?
【发布时间】:2012-05-22 22:28:21
【问题描述】:

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

【问题讨论】:

    标签: c++


    【解决方案1】:

    使用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); } );
    

    【讨论】:

    • 但需要注意的是,copy_if 仅在 C++11 中,对吧?
    • @EitanT:不过,通过反转谓词,您可以在 C++03 中滥用 remove_copy_if
    • @Xeo 是的。我正在考虑创建一个矢量副本,然后使用v2.erase(remove_if(str.begin(), str.end(), simple_criterion), str.end);
    • @EitanT:不过,这涉及到很多不必要的复制/破坏,而且你需要遍历空间两次。
    【解决方案2】:

    使用一点 Boost,您可以:

    std::vector<int> v = {1,2,-9,3};
    
    for (auto i : v | filtered(_arg1 >=0))
        std::cout << i << "\n";
    

    此示例将 Phoenix 用于由表达式模板 (_arg1 &gt;= 0) 定义的隐式 lambda,但您可以将任何可调用的(C++03 或更高版本)与 Boost 适配器(过滤、转换、反转等)一起使用

    有关更多展示材料和完整示例,请参见此处:

    【讨论】:

    • 另一种好方法,如果需要,您可以扩展 Boost.Range 以根据过滤结果创建新向量,而无需将结果临时保存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多