如何用C++ ranges/views简化跳过范围中指定单个元素的代码?
跳过单指定位置元素的C++ Ranges简洁实现
要实现从范围中仅跳过一个指定位置元素的功能,你可以直接将两个子范围的临时组合传递给std::views::join,省去中间变量src,代码会更紧凑:
#include <iostream> #include <ranges> #include <vector> int main() { std::vector<int> values = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; const int skip_pos = 5; auto seq = std::views::join(std::initializer_list{ values | std::views::take(skip_pos), values | std::views::drop(skip_pos + 1) }); for (auto& v : seq) { std::cout << v << " "; } }
补充说明
- 上述代码通过
std::initializer_list直接打包take(skip_pos)和drop(skip_pos+1)生成的两个视图,再用std::views::join合并为连续范围,完全无需额外中间变量。 - 如果你的开发环境支持C++23,还可以用更直观的
std::views::concat替代join,进一步提升代码可读性:auto seq = std::views::concat( values | std::views::take(skip_pos), values | std::views::drop(skip_pos + 1) );
内容的提问来源于stack exchange,提问作者Damir Tenishev
相关产品推荐
相关产品推荐

