光之使者 发表于 2023-10-20 18:24:29

C++系列十:日常学习-范围库Ranges

目录

[*]前言
[*]介绍
[*]举例:

前言

不错麽
内容参考

[*]https://zh.cppreference.com/w/cpp/ranges
[*]Chatjpt
总结注意点:

[*]确保你的C++编译器支持C++20标准
[*]包含ranges头文件
[*]views的操作是惰性的,它们不会立即执行,而是在需要时计算。这意味着你可以构建复杂的管道,而不必担心性能问题。提供性能优势,因为它们避免了不必要的数据拷贝和临时存储。在处理大型数据集时,这种优化尤为重要。
[*]使用views不会修改原始数据,它们只是提供了对数据的查看和操作方式。因此,原始数据保持不变,不会被修改。
[*]要小心处理可能的异常情况,例如范围越界或无效的操作。可以使用try-catch块来处理异常。
[*]管道操作符 |(竖线符号)=>数据处理操作可以从左到右依次执行,
介绍

C++20引入了Ranges库,其中的views是该库的一个关键组成部分。views提供了一种现代化的、功能强大的方法来处理数据序列,它基于"range-based"编程范式,允许你以声明性的方式对数据序列进行操作,而无需手动编写循环。以下是关于views的详细介绍:
<ol>什么是views?
views是C++20中Ranges库的一部分,它代表了一个数据序列的虚拟视图。这个视图允许你以一种便捷和现代的方式访问和操作数据,同时不需要实际地拷贝或修改原始数据。views的操作是惰性的,只有在需要的时候才会执行。
视图的创建:
你可以通过调用标准容器的views成员函数或使用适配器来创建视图。例如,可以使用std::vector创建一个视图:
std::vector<int> numbers = {1, 2, 3, 4, 5};
auto view = numbers | std::views::transform([](int x) { return x * 2; });在这里,std::views::transform是一个视图适配器,它将一个函数应用于容器中的每个元素,创建一个新的视图。
视图的操作:
一旦创建了视图,你可以对其执行各种操作,这些操作包括但不限于:

[*]筛选(filtering):筛选出满足特定条件的元素。
[*]映射(mapping):将函数应用于序列中的每个元素。
[*]切片(slicing):选择范围内的元素。
[*]排序(sorting):对元素进行排序。
你可以将多个操作组合在一起来创建复杂的数据处理管道,而这些操作都是惰性执行的。
遍历视图:
一旦创建了视图,你可以使用for循环或范围for循环来遍历它。视图会在遍历时动态计算元素,而不会一次性生成所有元素。
for (int num : view) {       std::cout 2 4auto evenNumbers = numbers | std::views::filter([](int x) { return x % 2 == 0; });// 使用views::slice选择范围(int x) { return x % 2 == 0; })                      | std::views::transform([](int x) { return x * 2; });// 使用views::iota生成范围[1, 10)=>1~9auto sequence = std::views::iota(1, 10);// 生成无限递增序列~~~auto infiniteSequence = std::views::iota(1);   // 使用views::reverse反向迭代容器=>5 4 3 2 1auto reversed = numbers | std::views::reverse;    // 使用views::concat合并两个容器std::vector numbers1 = {1, 2, 3};std::vector numbers2 = {4, 5, 6};auto combined = std::views::concat(numbers1, numbers2);for (int num : doubled) {std::cout
页: [1]
查看完整版本: C++系列十:日常学习-范围库Ranges