gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:29:05 26 4
gpt4 key购买 nike

为了从 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com