c++ - 从 std::vector 中过滤掉元素的有效方法

标签 c++ algorithm c++11 boost stl

为了从 std::vector 中过滤掉一些坏元素,我最终使用了以下代码:

#include <iostream>
#include <vector>
#include <algorithm>

typedef struct mystruct {
    int id;
    std::string name;
};

int main()
{        
    std::vector<mystruct> all_items = {{151, "test1"}, {154, "test4"}, {152, "test2"}, {151, "test1"}, {151, "test1"}, {153, "test3"}};
    std::vector<int> bad_ids = {151, 152};
    std::vector<mystruct> filter_items;

    for (const auto& item : all_items) {
        if ( std::find(bad_ids.begin(), bad_ids.end(), item.id) != bad_ids.end() ) {
            std::cout << "id: " << item.id << " is bad" << std::endl;
        } else {
            std::cout << "id: " << item.id << " is good item" << std::endl;
            filter_items.emplace_back(item);
        }
    }

    for (auto f : filter_items) {
        std::cout << "Good item: " << f.id << std::endl;
    }
}

有没有更有效的方法? std::remove_copy_if 或 Boost 可以在这里使用吗?如何使用?

最佳答案

是的,您可以使用 std::remove_copy_if ,例如

std::remove_copy_if(
  all_items.begin(), 
  all_items.end(), 
  std::back_inserter(filter_items),
  [&bad_ids](const mystruct& item) { return std::find(bad_ids.begin(), bad_ids.end(), item.id) != bad_ids.end(); });

LIVE

或者您可以使用 std::remove_iferase直接在 vector 上的元素,例如

all_items.erase(
  std::remove_if(
    all_items.begin(), 
    all_items.end(), 
    [&bad_ids](const mystruct& item) { return std::find(bad_ids.begin(), bad_ids.end(), item.id) != bad_ids.end(); }), 
  all_items.end());

LIVE

关于c++ - 从 std::vector 中过滤掉元素的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46236447/

相关文章:

c++ - 如何使用 cout 以全精度打印 double 值?

java - 为构建基数搜索树匹配字符串前缀的最快方法是什么?

python - 求和最大路径算法给出了意想不到的解决方案

c++ - 为什么这个依赖名称查找找到的是全局标识符而不是方法?

c++ - GDB是否可以只运行一个线程

c++ - 模板类中的友元运算符声明

c++ - std::超出 vector 范围<string>

c++ - 对这两个赋值运算符之间的不同感到困惑

python - 如果 Ri > T 得到验证,则为每个元素 i 添加到列表 L 中的机会均等

c++ - 如何从 istream 的开头可移植地获取以字节为单位的偏移量?