当前位置: 首页 > news >正文

std::ranges::views::reverse, std::ranges::reverse_view

std::ranges::views::reverse, std::ranges::reverse_view

C++20 中用于反转范围元素的工具

核心概念

  • 功能:将输入范围的元素按逆序呈现。
  • 适用场景:需要逆序遍历或处理范围时(如反向搜索、逆序输出)。
  • 惰性求值:不会实际修改底层数据,仅在访问时动态反转顺序。

std::ranges::reverse_view

  • 要求
    • 输入范围必须是双向范围(即支持 ranges::begin 和 ranges::end 返回双向迭代器)。
示例 1:基本用法
#include <ranges>
#include <vector>
#include <iostream>

int main() 
{
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::ranges::reverse_view reversed_view{vec};

    for (int x : reversed_view) 
    {
        std::cout << x << " "; // 输出:5 4 3 2 1
    }
}
示例 2:组合其他视图
#include <ranges>
#include <vector>
#include <iostream>

int main() 
{
    std::vector<int> vec = {1, 2, 3, 4, 5};
    auto even = vec | std::views::filter([](int x) { return x % 2 == 0; });
    auto reversed_even = even | std::views::reverse;

    for (int x : reversed_even) 
    {
        std::cout << x << " "; // 输出:4 2
    }
}

std::ranges::views::reverse

  • 定义:范围适配器对象,可通过管道操作符 | 简化 reverse_view 的创建。
  • 等效操作views::reverse(r) 等价于 reverse_view<decltype(r)>{r}
示例 3:使用管道操作符
#include <ranges>
#include <vector>
#include <iostream>

int main() 
{
    std::vector<int> vec = {1, 2, 3, 4, 5};
    auto reversed = vec | std::views::reverse;

    for (int x : reversed)
    {
        std::cout << x << " "; // 输出:5 4 3 2 1
    }
}

注意事项

  1. 双向迭代器要求:输入范围必须提供双向迭代器(如 std::vectorstd::list 支持,但 std::forward_list 不支持)。
  2. 性能:反转操作的时间复杂度为 O(1),实际遍历时通过反向移动迭代器实现。
  3. 数据所有权reverse_view 不拥有底层数据,需确保原始数据的生命周期足够长。

与 std::reverse 的区别

| 特性 |          std::ranges::reverse_view |        std::reverse |

修改数据       | 否(仅视图)                                是(直接修改容器)

时间复杂度   | O(1)(惰性求值)                         O(N)(实际反转元素) 

适用场景       | 需要临时逆序访问                         需要永久反转数据 

示例 4:与 std::reverse 对比
#include <algorithm>
#include <ranges>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 使用 reverse_view(不修改原数据)
    auto reversed_view = vec | std::views::reverse;
    std::cout << "Original: ";
    for (int x : vec) std::cout << x << " "; // 输出:1 2 3 4 5

    // 使用 std::reverse(修改原数据)
    std::reverse(vec.begin(), vec.end());
    std::cout << "\nAfter std::reverse: ";
    for (int x : vec) std::cout << x << " "; // 输出:5 4 3 2 1
}

总结

  • reverse_view:提供逆序访问的视图,不修改底层数据。
  • views::reverse:通过管道操作符简化 reverse_view 的创建。
  • 适用场景:需要临时逆序操作或与其他视图组合时。
http://www.dtcms.com/a/64763.html

相关文章:

  • 什么是 Java 的 SPI(Service Provider Interface)机制?
  • doris:外表统计信息
  • mock的定义和使用场景
  • LORA中 软提示是什么
  • LoRA,DoRA,RSLoRA,LoRA+ 是什么
  • STM32外部中断
  • 复现 MoGe
  • 计算机网络:Socket编程 Tcp协议 第二弹
  • 传智杯-省赛-第二场(B组)题解
  • 限制数据库字段长度的公用写法:length和like和rlike对于限制字段长度的原理与区别
  • 【技海登峰】Kafka漫谈系列(九)SpringBoot整合Kafka多数据源配置
  • BFS最短路径(十六)127. 单词接龙 困难
  • 爬虫案例十四js逆向中国五矿
  • 2.库函数的模拟实现
  • ES怎么通过客户端操作和查询/curl操作指令
  • DeepBI驱动的动态预算与库存联动调整策略
  • 当AI回答问题时,它的“大脑”里在炒什么菜?
  • LoRa无线通讯边缘网关-EG2000-数据上云和远程组网
  • Android电量与流量优化
  • npm、pnpm、cnpm、yarn、npx之间的区别
  • 我的创作纪念日:730天的技术写作之旅
  • 11 | 给 Gin 服务器添加中间件
  • 晨控CK-FR08与汇川H5U系列PLC配置EtherNet/IP通讯连接手册
  • 六、OpenGL中EBO的使用及本质
  • 【Godot4.3】斜抛运动轨迹曲线点求取函数
  • 时间序列模型(1):LSTNet
  • 解决ubuntu(jetpack)系统下系统盘存储不够的
  • MongoDB备份与还原
  • 2025年第十届数维杯大学生数学建模挑战赛参赛规则
  • Windows根据文件名批量在文件夹里查找文件并复制出来,用WPF实现的详细步骤