C++中如何移除range范围内指定位置的第N个元素?
移除Range指定索引元素的实现方案
使用ranges-v3库实现
你可以选择两种常用实现方式:
- 视图拼接法(性能最优,无额外遍历判断开销)
直接截取索引3之前的元素,拼接索引4及之后的元素,刚好跳过索引3的位置:my_range | ranges::views::take(3) | ranges::views::concat(ranges::views::drop(4)) - 索引过滤法(灵活适配多索引删除的场景)
配合enumerate视图获取每个元素的索引,过滤后提取值即可:my_range | ranges::views::enumerate | ranges::views::filter([](auto const& elem) { return elem.first != 3; }) | ranges::views::values
使用C++标准库实现
C++23及以上版本
C++23标准库已经内置了enumerate、concat等视图,和ranges-v3的用法基本一致:
- 视图拼接法:
my_range | std::views::take(3) | std::views::concat(std::views::drop(4)) - 索引过滤法:
my_range | std::views::enumerate | std::views::filter([](auto const& elem) { return elem.first != 3; }) | std::views::values
C++20版本
C++20标准库未内置enumerate和concat,可以用捕获索引计数器的方式简单实现:
int idx = 0; auto res = my_range | std::views::filter([&idx](auto const& val) { return idx++ != 3; });
注意:该方法仅适用于单遍历场景,多次遍历该视图会导致索引计数错乱,如需多遍历安全的实现建议引入ranges-v3库或升级到C++23版本。
内容的提问来源于stack exchange,提问作者AnArrayOfFunctions
相关产品推荐
相关产品推荐

