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

std::ranges::views::counted

std::ranges::views::counted

基本概念

1. 功能
  • 创建子范围视图:根据给定的迭代器和元素数量,创建一个包含 N 个连续元素的视图。
  • 惰性求值:不复制元素,直接引用原始数据。
  • 兼容性:支持所有满足 std::input_iterator 的迭代器类型。

语法与参数

1. 语法
auto counted_view = std::ranges::views::counted(iterator, count);

 

  • iterator:起始迭代器。
  • count:子范围包含的元素数量(必须非负)。

示例

示例 1:处理数组
#include <iostream>
#include <ranges>

int main() 
{
    int arr[] = {1, 2, 3, 4, 5};
    
    // 从第2个元素开始,取3个元素
    auto view = std::views::counted(arr + 1, 3);
    
    for (int num : view) 
    {
        std::cout << num << " "; // 输出:2 3 4
    }
}
示例 2:处理容器
#include <iostream>
#include <ranges>
#include <vector>

int main() 
{
    std::vector<int> data = {10, 20, 30, 40, 50};
    
    // 从第3个元素开始,取2个元素
    auto it = data.begin() + 2;
    auto view = std::views::counted(it, 2);
    
    for (int num : view) 
    {
        std::cout << num << " "; // 输出:30 40
    }
}
示例 3:与其他视图适配器组合
#include <iostream>
#include <ranges>
#include <vector>

int main()
{
    std::vector<int> data = {1, 2, 3, 4, 5};
    
    // 取前3个元素,再过滤偶数
    auto view = std::views::counted(data.begin(), 3)
              | std::views::filter([](int x) { return x % 2 != 0; });
    
    for (int num : view)
    {
        std::cout << num << " "; // 输出:1 3
    }
}
示例 4:处理输入迭代器
#include <iostream>
#include <ranges>
#include <sstream>
#include <iterator>

int main() 
{
    std::istringstream iss("1 2 3 4 5");
    auto input_it = std::istream_iterator<int>(iss);
    
    // 从输入流迭代器开始,取3个元素
    auto view = std::views::counted(input_it, 3);
    
    for (int num : view) 
    {
        std::cout << num << " "; // 输出:1 2 3
    }
}

注意事项

  1. 迭代器有效性

    • counted_view 是原始范围的视图,不拥有数据。确保底层数据在视图使用期间有效。
    • 若迭代器是悬空引用(如指向已销毁的容器),行为未定义。
  2. 数量限制

    • count 必须是非负整数,否则行为未定义。
    • 若 count 超过实际剩余元素数量,视图会以实际剩余元素为界。

与 take_view 的区别

| 特性 |                       counted_view                                 | take_view | 

参数类型 |             迭代器 + 元素数量                              范围 + 元素数量 | | 

适用场景 | 已知起始迭代器但无完整范围时                     直接操作现有范围时 | | 

典型用例 | 处理迭代器来自非范围上下文(如指针)       从已有范围开头截取子范围 |


总结

  • 核心用途:基于迭代器和数量快速创建子范围视图。
  • 适用场景
    • 处理原始指针或迭代器(如 C 风格数组)。
    • 与其他视图适配器组合使用。
    • 需要精确控制起始位置和元素数量的场景。

相关文章:

  • SCT2632-3A持续输出电流,输入电压范围:4.2V-60V,降压DCDC转换器
  • 神经网络机器学习中说的过拟合是什么意思
  • 【论文笔记】Best Practices and Lessons Learned on Synthetic Data for Language Models
  • 编译OpenSSL
  • JVM内存结构笔记04-字符串常量池
  • 神经网络完成训练的详细过程
  • linux - ubuntu 使用时一些小问题整理 --- 持续更新
  • 【音视频】H265-NALU-AVpacket-PS-RTP(GB28181)
  • 业务数据分析极简通用方法论
  • 3.12-3 html
  • VSTO(C#)Excel开发5:调整表格到一页
  • K8S学习之基础二十七:k8s中daemonset控制器
  • @RestControllerAdvice注解
  • Adaptive AUTOSAR UCM模块——快速入门
  • 安卓Compose中accompanist库使用详解
  • 【蓝桥杯python研究生组备赛】003 贪心
  • Python Reverse Engineering的中文意思是什么?概念分析、工具与技术、实施步骤、扩展阅读?
  • 部署达梦数据库到服务器
  • MySQL:SQL优化实际案例解析(持续更新)
  • JDK8和JDK17 Thread.interrupt() 实现区别
  • 财政部:今年将和住建部选拔第二批20个城市,高质量推进城市更新行动
  • 这款小孩子最爱的饮料,害处竟大到不敢想象
  • 广东进入“倒水模式”,珠江防总、珠江委已启动Ⅳ级应急响应
  • 福建、广西等地有大暴雨,国家防总启动防汛四级应急响应
  • 美国务卿与以色列总理通话,讨论加沙局势
  • 时隔三年,俄乌直接谈判重启