gpt4 book ai didi

c++ - 带有包含变体的 vector 的 Remove_if

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:03:33 24 4
gpt4 key购买 nike

我有两个不同的对象:

struct TypeA {
std::size_t no;
std::string data;
std::string data2;
};

struct TypeB {
std::size_t no;
std::string data;
std::string data2;
std::string data3;
};

它们存储在 std::vector 中,带有 std::variant

std::vector<std::variant< TypeA, TypeB>> ab;

现在我想删除成员 no = 0 的所有元素。

没有 std::variant 和只包含 TypeA 的 vector ,我会这样做:

ab.erase(std::remove_if(ab.begin(), ab.end(),
[](const TypeA& a) { return a.no == 0; }), ab.end());

但是如何合并 std::variant 呢?我试图用 std::visit 想出一些东西,但我不能在 std::remove_if 的谓词中添加它,我可以吗?

最佳答案

是的,std::visit可以帮助。仿函数传递给 visit只需要能够接受 variant 的每种类型,最简单的方法是使用通用的 lambda:

ab.erase(
std::remove_if(
ab.begin(),
ab.end(),
[](const auto &v) {
return std::visit(
[](const auto &obj) { return obj.no == 0; },
v);
}),
ab.end());

这里是 v 的类型因为外层 lambda 总是用作 const std::variant<TypeA, TypeB>& , 和 auto比输入 std::variant<TypeA, TypeB> 更方便.但是对于内部 lambda,lambda 是通用的很重要,因为 visit将实例化其模板 operator()TypeATypeB .

关于c++ - 带有包含变体的 vector 的 Remove_if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54469306/

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