gpt4 book ai didi

c++ - 使用其范围版本从容器中删除元素的最佳方法

转载 作者:太空狗 更新时间:2023-10-29 21:32:13 26 4
gpt4 key购买 nike

我在我的代码中遇到一个常见问题,我想在它满足谓词后从反向 std::vector 中只删除一个元素。我知道有多种方法可以使用 ranges-v3 执行此操作,但我想出的每种方法似乎都有些令人费解。

这是目标 vector v 的示例:

std::vector v = { 1, 2, 3, 2, 4 };

结果需要是 vector r:

std::vector r = { 1, 2, 3, 4 };

这将通过删除在反向遍历 vector v 时找到的前 2 个(通过 lambda 谓词“is_two”)来完成。

这是在普通 C++ 原始循环中的样子:

auto is_two = [](int a) { return a == 2; };

for (int i = v.size(); --i >= 0;) {

if (is_two(v[i])) {

v.erase(v.begin() + i);
break;
}
}

这是我的错误范围-v3 版本:

namespace rs = ranges;
namespace rv = ranges::view;
namespace ra = ranges::action;

rs::for_each(v | rv::enumerate
| rv::reverse
| rv::filter([](auto i_e) { return i_e.second == 2; })
| rv::take(1),

[&](auto& i_e) { v.erase(v.begin() + i_e.first); });

理想情况下,我想知道是否有一些看起来像这样的解决方案:

ra::remove_if(v | rv::reverse, is_two);

概括地说,我想知道如何获取一个容器,通过一些 ranges::view 操作对其进行管道处理,然后从原始容器中删除结果范围内的元素。

最佳答案

由于似乎没有人想出更好的方法,为了您的利益,我想提一下使用旧的 reverse_iterator 的可能性。

vec.erase(std::prev(ranges::find_if(vec.rbegin(), vec.rend(), is_two).base()));

不可否认,这不是很范围,但至少它有效。

关于c++ - 使用其范围版本从容器中删除元素的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55789282/

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