C++20的ranges::命名空间
在 C++20 中,<algorithm>头文件中的许多算法被引入了
std::ranges命名空间,这些算法支持范围(Range)概念,提供了更现代、更安全的接口。以下是
C++20 std::ranges中主要的算法分类和示例:
1. 不修改序列的算法(Non-modifying)
- 查找类:
ranges::find/ranges::find_if/ranges::find_if_notranges::find_first_ofranges::adjacent_findranges::search/ranges::search_nranges::find_endranges::binary_search(需范围有序)ranges::lower_bound/ranges::upper_bound/ranges::equal_range(需范围有序)
- 计数类:
ranges::count/ranges::count_if
- 比较类:
ranges::equalranges::mismatchranges::lexicographical_compare
- 检查类:
ranges::all_of/ranges::any_of/ranges::none_ofranges::starts_with/ranges::ends_with(C++23)
2. 修改序列的算法(Modifying)
- 复制类:
ranges::copy/ranges::copy_ifranges::copy_nranges::copy_backward
- 移动类:
ranges::move/ranges::move_backward
- 填充类:
ranges::fill/ranges::fill_n
- 生成类:
ranges::generate/ranges::generate_n
- 删除类:
ranges::remove/ranges::remove_ifranges::remove_copy/ranges::remove_copy_if
- 替换类:
ranges::replace/ranges::replace_ifranges::replace_copy/ranges::replace_copy_if
- 去重类:
ranges::unique/ranges::unique_copy
- 交换类:
ranges::swap_rangesranges::reverse/ranges::reverse_copyranges::rotate/ranges::rotate_copyranges::shift_left/ranges::shift_right(C++23)
3. 划分与排序算法(Partitioning/Sorting)
- 划分类:
ranges::partition/ranges::stable_partitionranges::partition_copyranges::is_partitionedranges::partition_point
- 排序类:
ranges::sort/ranges::stable_sortranges::partial_sort/ranges::partial_sort_copyranges::nth_elementranges::is_sorted/ranges::is_sorted_until
4. 堆操作(Heap Operations)
ranges::make_heap/ranges::push_heap/ranges::pop_heapranges::sort_heapranges::is_heap/ranges::is_heap_until
5. 集合操作(Set Operations)
- 有序范围操作:
ranges::merge/ranges::inplace_mergeranges::includesranges::set_difference/ranges::set_intersectionranges::set_symmetric_difference/ranges::set_union
6. 排列与组合(Permutations)
ranges::next_permutation/ranges::prev_permutationranges::is_permutation
7. 数值操作(Numeric)
<numeric>中的范围版本:ranges::iota(C++23)- 其他数值算法(如
reduce、transform_reduce)尚未完全引入范围版本。
关键改进
- 支持范围(Range):直接接受容器或视图,无需迭代器对(如
std::vector<int> v; ranges::sort(v);)。 - 投影(Projection):通过
std::identity或自定义投影函数灵活处理元素(如ranges::sort(v, {}, &Person::age))。 - 约束(Constrained):使用概念(Concepts)约束参数类型,编译期错误更友好。
示例代码
|
总结
C++20 的
std::ranges算法提供了更简洁、安全的接口,结合范围(Range)、视图(View)和投影(Projection)等特性,显著提升了代码的可读性和表达能力。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 qyhome!
