C++迭代器与范围编程

C++迭代器与范围编程 C迭代器与范围编程迭代器是STL中连接容器和算法的桥梁。C20引入的范围库提供了更简洁的遍历方式结合视图可以高效处理数据序列。迭代器类别决定其能力输入、输出、前向、双向和随机访问。#include#include#include#include#include#includevoid iterator_categories() {std::vector vec {1, 2, 3, 4, 5};auto it vec.begin();std::cout Random access: it[2] \n;std::cout Distance: (vec.end() - vec.begin()) \n;std::list lst {1, 2, 3};auto lit lst.begin();std::advance(lit, 2);std::cout List forward/bidirectional: *lit \n;}C20的范围库。void ranges_basics() {std::vector data {5, 2, 8, 1, 9, 3, 7, 4, 6};std::ranges::sort(data);std::cout Sorted: ;for (int v : data) std::cout v ;std::cout \n;auto it std::ranges::find(data, 5);if (it ! data.end()) {std::cout Found 5 at: (it - data.begin()) \n;}}范围视图提供惰性计算。void range_views() {std::vector data {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};auto even data | std::views::filter([](int n) { return n % 2 0; })| std::views::transform([](int n) { return n * n; });std::cout Even squares: ;for (int v : even) std::cout v ;std::cout \n;}视图的组合使用。void view_composition() {std::vector data {5, 3, 1, 4, 2, 6, 8, 7};auto result data| std::views::filter([](int n) { return n 3; })| std::views::transform([](int n) { return n * 2; })| std::views::take(3);std::cout First 3 doubled values 3: ;for (int v : result) std::cout v ;std::cout \n;}std::span轻量视图。#includevoid span_example(std::span values) {std::cout Span size: values.size() [;for (size_t i 0; i values.size(); i) {if (i 0) std::cout , ;std::cout values[i];}std::cout ]\n;}void span_demo() {int arr[] {1, 2, 3, 4, 5};span_example(arr);std::vector vec {10, 20, 30};span_example(vec);auto first3 std::span(arr).first(3);span_example(first3);}生成器视图。void generate_view() {auto values std::views::iota(1, 10)| std::views::transform([](int n) { return n * n; });std::cout Squares 1-9: ;for (int v : values) std::cout v ;std::cout \n;auto even_iota std::views::iota(0)| std::views::filter([](int n) { return n % 2 0; })| std::views::take(10);std::cout First 10 even: ;for (int v : even_iota) std::cout v ;std::cout \n;}反向和分割视图。void split_join_view() {std::string text apple,banana,orange,grape;auto parts text | std::views::split(,);std::cout Split: ;for (auto part : parts) {std::cout std::string_view(part) ;}std::cout \n;std::vector data {1, 2, 3, 4, 5};auto reversed data | std::views::reverse;std::cout Reversed: ;for (int v : reversed) std::cout v ;std::cout \n;}范围与算法结合。void ranges_algorithms() {std::vector data {5, 2, 8, 1, 9, 3};std::ranges::sort(data);std::cout Sorted: ;std::ranges::copy(data, std::ostream_iterator(std::cout, ));std::cout \n;int min std::ranges::min(data);int max std::ranges::max(data);std::cout Min: min , Max: max \n;auto sum std::ranges::fold_left(data, 0, std::plus());std::cout Sum: sum \n;}范围提供更简洁、更安全的编程方式是C20的重要特性。