std::ranges::iota

news2025/5/20 21:32:19

std::ranges::iota_viewstd::views::iota 是 C++23 Ranges 库中的一部分,用于生成一系列递增的值,类似 Python 的 range() 或传统的 for 循环生成器。

一 原形

Defined in header <numeric>

Call signature

template< std::input_or_output_iterator O, std::sentinel_for<O> S,

          std::weakly_incrementable T >
requires std::indirectly_writable<O, const T&>
constexpr iota_result<O, T>

    iota( O first, S last, T value );
(1)(since C++23)
template< std::weakly_incrementable T, ranges::output_range<const T&> R >

constexpr iota_result<ranges::borrowed_iterator_t<R>, T>

    iota( R&& r, T value );
(2)(since C++23)

Helper types

template< class O, class T >
using iota_result = ranges::out_value_result<O, T>;

(3)(since C++23)

Fills the range [firstlast) with sequentially increasing values, starting with value and repetitively evaluating ++value.

Equivalent operation:

*(first)     = value;
*(first + 1) = ++value;
*(first + 2) = ++value;
*(first + 3) = ++value;
...

Parameters

first, last-the iterator-sentinel pair defining the range of elements to fill with sequentially increasing values starting with value
value-initial value to store; the expression ++value must be well-formed

Return value

{last, value + ranges::distance(first, last)}

Complexity

Exactly last - first increments and assignments.

二、用途

std::views::iota(start)
生成从 start 开始的 无限递增序列

std::views::iota(start, stop)
生成从 start 开始,到 不包括 stop有限递增序列


✅ 三、示例用法

示例 1:生成有限整数序列

#include <ranges>
#include <iostream>

int main() 
{
    for (int i : std::views::iota(0, 5)) 
    {
        std::cout << i << ' ';
    }
    std::cout << '\n';
}

 输出:

0 1 2 3 4

示例 2:无限序列 + 截断

#include <ranges>
#include <iostream>

int main() 
{
    auto infinite = std::views::iota(10);  // 无限递增从10开始

    for (int i : infinite | std::views::take(5)) 
    {
        std::cout << i << ' ';
    }
    std::cout << '\n';
}

输出:

10 11 12 13 14

示例 3:与自定义类型(如枚举或结构体)一起使用

你可以使用 std::views::iota 生成 enum, char, 或 std::chrono::time_point 等递增类型:

#include <ranges>
#include <iostream>

struct Test 
{
    int value;

    static constexpr int min = 0;
    static constexpr int max = 3;

    // 构造函数
    constexpr Test(int v = min) : value(v) {}

    // operator++ (前置递增)
    Test& operator++() {
        if (value < max) {
            ++value;
        }
        return *this;
    }

    // 比较运算符
    friend constexpr bool operator==(Test lhs, Test rhs) {
        return lhs.value == rhs.value;
    }

    friend constexpr bool operator!=(Test lhs, Test rhs) {
        return !(lhs == rhs);
    }

    friend constexpr bool operator<(Test lhs, Test rhs) {
        return lhs.value < rhs.value;
    }
};

int main() 
{
    for (Test c : std::views::iota(Test::min, Test::max)) 
    {
        std::cout << c.value << ' ';
    }
}

要求类型支持 operator++(即满足 std::weakly_incrementable)。

四、特性总结

特性描述
惰性生成元素按需生成,不占用内存
无限或有限序列可以无限增长,也可以指定边界
类型支持任何可自增类型,如整数、枚举、时间点
常与 views::take 配合限制无限序列长度
范围特性支持 forward range,支持迭代算法

五、组合使用案例

生成带序号的字符串:

#include <iostream>
#include <ranges>
#include <string>

int main() 
{
    auto greetings = std::views::iota(1)
                   | std::views::take(3)
                   | std::views::transform([](int i) {
                         return "Hello " + std::to_string(i);
                     });

    for (auto&& s : greetings) 
    {
        std::cout << s << '\n';
    }
}

 输出:

Hello 1
Hello 2
Hello 3
 

常见误区

错误用法正确方式
iota(0, n + 1.5) (混类型)确保起始和终止类型一致
iota(begin, end) 忘记终止值无限序列需要 take 来终止
用于不支持 ++ 的类型类型需支持自增(++


🧾 总结表

形式描述
std::views::iota(5)无限递增从 5 开始
std::views::iota(5, 10)有限递增:5 到 9
iota_view<char>('a', 'z'+1)生成 a~z 字符
views::iota(tp1, tp2)生成时间点 range(C++20)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2380256.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于OAuth2+SpringSecurity+Jwt实现身份认证和权限管理后端服务

1、简介 本文讲述了如何实现简易的后端鉴权服务。所谓“鉴权”&#xff0c;就是“身份鉴定”“权限判断”。涉及的技术有&#xff1a;OAuth2、SpringSecurity、Jwt、过滤器、拦截器。OAuth2用于授权&#xff0c;使用Jwt签发Access Token和Refresh Token&#xff0c;并管理token…

liunx定时任务,centos定时任务

yum install cronie crontabs -y直接运行 crond -n 在前台运行 crond -i 守护进程在没有inotify支持的情况下运行systemctl service crond start # 启动服务 systemctl enable crond.service # 设置开机自启 sudo systemctl restart crond # 重启 cron 服务systemctl serv…

三种嵌入式开发常用的组网方式

一、三种嵌入式开发常用的组网方式 这里记录了三种嵌入式开发常用的网络环境&#xff0c;最终目标也就是让开发板、虚拟机、物理机在同一个局域网下。一般的网络环境下都非常容易实现&#xff0c;但是对于学生校园网可得想些法子了&#xff0c;因为校园网一般会有设备连接数限…

ubuntu 20.04 ping baidu.coom可以通,ping www.baidu.com不通 【DNS出现问题】解决方案

ping baidu.coom可以通&#xff0c;ping www.baidu.com不通【DNS出现问题】解决方案 检查IPV6是否有问题 # 1. 检查 IPv6 地址&#xff0c;记住网络接口的名称 ip -6 addr show# 2. 测试本地 IPv6&#xff0c;eth0换成自己的网络接口名称 ping6 ff02::1%eth0# 3. 检查路由 ip…

城市排水管网流量监测系统解决方案

一、方案背景 随着工业的不断发展和城市人口的急剧增加&#xff0c;工业废水和城市污水的排放量也大量增加。目前&#xff0c;我国已成为世界上污水排放量大、增加速度快的国家之一。然而&#xff0c;总体而言污水处理能力较低&#xff0c;有相当部分未经处理的污水直接或间接排…

Ubuntu Desktop QEMU/KVM中使用Ubuntu Server 22.04配置k8s集群

Ubuntu Desktop QEMU/KVM中使用Ubuntu Server 22.04配置k8s集群 1.本机部署个代理 这里我是自己用dockersing-box 部署的 http://192.168.2.105:10808 如果 用v2rayN等软件部署的&#xff0c;记得开启局域网共享 2.安装虚拟机 我本机使用的是Ubuntu Desktop ,这里在QEMU/K…

YOLOv8 在单片机上的几种部署方案

YOLOv8 在单片机上的部署方案 单片机资源&#xff08;如内存、计算能力&#xff09;有限&#xff0c;直接部署完整的 YOLOv8 模型并不现实。不过&#xff0c;我们可以通过模型量化、优化和使用轻量级框架来实现简化版的目标检测。下面为你介绍几种可行的方案&#xff1a; 方案…

后端框架(1):Mybatis

什么是框架&#xff1f; 盖高楼&#xff0c;框架结构。 框架结构就是高楼的主体&#xff0c;基础功能。 把很多基础功能已经实现了(封装了)。 在基础语言之上&#xff0c;对各种基础功能进行封装&#xff0c;方便开发者&#xff0c;提高开发效率。 mybatis&#xff1a;对jd…

linux下tcp/ip网络通信笔记1,

本文章主要为博主在学习网络通信的笔记一个Udp_echo_server,和client的代码实现 1&#xff0c;网络发展&#xff0c;网络协议&#xff0c;意识到网络通信——不同主机的进程间通信&#xff0c; 2&#xff0c;学习如何在应用层调用系统提供的接口进行通信&#xff0c;echo_Udp…

语音识别——声纹识别

通过将说话人的声音与数据库中的记录声音进行比对&#xff0c;判断说话人是否为数据库白名单中的同一人&#xff0c;从而完成语音验证。目前&#xff0c;3D-Speaker 声纹验证的效果较为出色。 3D-Speaker 是一个开源工具包&#xff0c;可用于单模态和多模态的说话人验证、说话…

window 显示驱动开发-报告图形内存(三)

图形内存报告示例 示例 1&#xff1a;笔记本电脑上的 128 MB 专用板载图形内存 以下屏幕截图显示了使用 Intel Iris 离散图形适配器运行 Windows 11 的 Surface 笔记本电脑的计算图形内存数。 适配器的可用内存总数为 16424 MB&#xff0c;用于图形用途&#xff0c;细分如下&…

UE5 GAS框架解析内部数据处理机制——服务器与客户端

当&#xff0c; gas通过点击鼠标光标触发事件时&#xff0c;内部的处理机制。 当通过点击事件&#xff0c;命中中目标时&#xff0c; 可获取到对应的TargetData 目标数据。处理相应的操作。 仅有本地的客户端的情况下。命中并不会有什么异常。 当存在服务器时&#xff0c; 服…

开源GPU架构RISC-V VCIX的深度学习潜力测试:从RTL仿真到MNIST实战

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 一、开篇&#xff1a;AI芯片架构演变的三重挑战 &#xff08;引述TPUv4采用RISC-V的行业案…

Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(七)

Android Coli 3 ImageView load two suit Bitmap thumb and formal&#xff0c;Kotlin&#xff08;七&#xff09; 在 Android Coli 3 ImageView load two suit Bitmap thumb and formal&#xff0c;Kotlin&#xff08;六&#xff09;-CSDN博客 的基础上改进&#xff0c;主要是…

【工具】Windows|外接的显示器怎么用软件调亮度(Brightness Slider)

文章目录 工具安装及使用Twinkle Tray&#xff1a;Brightness Slider补充背景知识1. DDC/CI&#xff08;Display Data Channel Command Interface&#xff09;2. WMI&#xff08;Windows Management Instrumentation&#xff09;3. Twinkle Tray如何结合两者&#xff1f;对比总…

【Nextcloud】使用 LNMP 架构搭建私有云存储:Nextcloud 实战指南

目录 一、环境准备与基础配置 1. 系统环境要求 2. 初始化系统配置 二、搭建 LNMP 基础架构 1. 一键安装 LNMP 组件 2. 启动数据库服务 三、部署 Nextcloud 存储服务 1. 上传并解压安装包 2. 设置目录权限&#xff08;测试环境配置&#xff09; 3. 配置 MariaDB 数据库…

【办公类-100-01】20250515手机导出教学照片,自动上传csdn+最小化Vscode界面

背景说明&#xff1a; 每次把教学照片上传csdn&#xff0c;都需要打开相册&#xff0c;一张张截图&#xff0c;然后ctrlV黏贴到CSDN内&#xff0c;我觉得太烦了。 改进思路&#xff1a; 是否可以先把所有照片都上传到csdn&#xff0c;然后再一张张的截图&#xff08;去掉幼儿…

uniapp-商城-60-后台 新增商品(属性的选中和页面显示,数组join 的使用)

前面添加了属性&#xff0c;添加属性的子级项目。也分析了如何回显&#xff0c;但是在添加新的商品的时&#xff0c;我们也同样需要进行选择&#xff0c;还要能正常的显示在界面上。下面对页面的显示进行分析。 1、界面情况回顾 属性显示其实是个一嵌套的数据显示。 2、选中的…

[c语言日寄]数据结构:栈

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

WEB安全--Java安全--LazyMap_CC1利用链

一、前言 该篇是基于WEB安全--Java安全--CC1利用链-CSDN博客的补充&#xff0c;上篇文章利用的是TransformedMap类&#xff0c;而CC链的原作者是利用的LazyMap类作为介质进行的触发。 所以本文将分析国外原作者在ysoserial commonscollections1中给出的CC1利用链。 二、回顾梳…