C++20中头文件ranges的使用
<ranges>是C++20中新增加的头文件,提供了一组与范围(ranges)相关的功能,此头文件是ranges库的一部分。包括:
1.concepts:
(1).std::ranges::range:指定类型为range,即它提供开始迭代器和结束标记(it provides a begin iterator and an end sentinel)。
(2).std::ranges::sized_range:指定range在恒定时间(constant time)内知道其大小。
(3).std::ranges::contiguous_range:指定range的迭代器类型满足std::contiguous_iterator。
namespace {struct SimpleRange { // a minimum rangeint* begin();int* end();
};struct NotRange { // not a range: begin does not return an input_or_output_iteratorvoid* begin();int* end();
};} // namespaceint test_ranges_concepts()
{
#ifdef _MSC_VERstatic_assert(std::ranges::range<SimpleRange>);static_assert(!std::ranges::range<NotRange>);
#endifstatic_assert(std::ranges::sized_range<std::list<int>> and not std::ranges::sized_range<std::forward_list<int>>);static_assert(std::ranges::contiguous_range<const std::vector<int>> and not std::ranges::contiguous_range<std::list<int>>);return 0;
}
2.classes: std::views是std::ranges::views的别名
(1).std::ranges::subrange:将迭代器-标记对(iterator-sentinel pair)组合成一个视图(view)。
(2).std::ranges::views::empty、std::ranges::empty_view:没有任何元素的空视图。
(3).std::ranges::views::single、std::ranges::single_view:包含指定值的单个元素的视图。
(4).std::ranges::views::iota、std::ranges::iota_view:由重复增加初始值生成的序列构成的视图。
(5).std::ranges::views::istream、std::ranges::basic_istream_view:在相关输入流上连续应用运算符>>所获得的元素组成的视图。
(6).std::ranges::views::all、std::ranges::views::all_t:包含range的所有元素的视图。
(7).std::ranges::ref_view:其它range的元素的视图。
(8).std::ranges::views::take、std::ranges::take_view:由另一个视图的前N个元素组成的视图。
(9).std::ranges::owning_view:对某一range具有唯一所有权的视图。
(10).std::ranges::views::drop、std::ranges::drop_view:由另一个视图的元素组成的视图,跳过前N个元素。
(11).std::ranges::views::join、std::ranges::join_view:由展平(flattening)ranges视图获得的序列组成的视图。
(12).std::ranges::views::counted:从迭代器和计数创建一个子range。
(13).std::ranges::views::elements、std::ranges::elements_view:采用由类似元组的值和数字N组成的视图,并生成每个元组的第N个元素的视图。
int test_ranges_classes()
{// std::ranges::views == std::views// std::ranges::subrangeconst std::multimap<int, char> mm{ {1, 'a'}, {2, 'a'}, {1, 'c'}, {3, 'd'}, {1, 'e'}, {1, 'f'} };auto [first, last] = mm.equal_range(1);for (const auto& [_, v] : std::ranges::subrange(first, last))std::cout << v << ","; // a,c,e,f,std::cout << std::endl;// std::ranges::empty_viewstd::ranges::empty_view<long> e;static_assert(std::ranges::empty(e));static_assert(0 == e.size());static_assert(nullptr == e.data());static_assert(nullptr == e.begin());static_assert(nullptr == e.end());// std::ranges::single_viewconstexpr std::ranges::single_view sv1{ std::numbers::pi };static_assert(sv1);static_assert(not sv1.empty());std::cout << "data:" << *sv1.data() << ";begin:" << *sv1.begin() << ";size:" << sv1.size() << ";distance:" << std::distance(sv1.begin(), sv1.end()) << std::endl; // data:3.14159;begin:3.14159;size:1;distance:1std::ranges::single_view<std::tuple<int, double, std::string>> sv2{ {1, std::numbers::sqrt2, "^-^"} };std::cout << "value:" << std::get<0>(sv2[0]) << "," << std::get<1>(sv2[0]) << "," << std::get<2>(sv2[0]) << std::endl; // value:1,1.41421,^-^// std::ranges::views::iota/std::ranges::iota_viewfor (auto i : std::ranges::iota_view{ 1, 10 })std::cout << i << ' '; // 1 2 3 4 5 6 7 8 9std::cout << std::endl;for (auto i : std::ranges::views::iota(1, 10))std::cout << i << ' '; // 1 2 3 4 5 6 7 8 9std::cout << std::endl;// std::ranges::views::istreamauto words = std::istringstream{ "today is yesterday's tomorrow" };for (const auto& s : std::views::istream<std::string>(words))std::cout << std::quoted(s, '/') << ' '; // /today/ /is/ /yesterday's/ /tomorrow/std::cout << '\n';// std::views::allconst std::vector<int> vec{ 0, 1, 2, 3, 4, 5 };for (auto n : std::views::all(vec))std::cout << n << ' '; // 0 1 2 3 4 5std::cout << std::endl;// std::ranges::take_view,std::ranges::ref_viewconst std::string str{ "Messy_Test" };const std::ranges::take_view tv{ str, 5 };std::cout << "second element:" << *(tv.data()+1) << ",size:" << tv.size() << std::endl; // second element:e,size:5const std::ranges::ref_view rv{ tv };std::cout << "empty:" << rv.empty() << ",size:" << rv.size() << ",begin:" << *rv.begin() << ",end:" << *(rv.end() - 1) << ",data:" << rv.data() << std::endl; // empty:0,size:5,begin:M,end:y,data:Messy_Testfor (const auto c : rv)std::cout << c; // Messystd::cout << std::endl;// std::ranges::owning_viewusing namespace std::literals;std::ranges::owning_view ov{ "Messy_Test"s }; // <== ov{std::string{"Messy_Test"}}assert(ov.empty() == false && ov.size() == 10 && ov.front() == 'M' && ov.back() == 't');// std::ranges::drop_view,std::views::dropconst auto nums = { 1, 2, 3, 4, 5, 6, 7 };for (auto i : std::ranges::drop_view{ nums, 2 })std::cout << i << ' '; // 3 4 5 6 7std::cout << std::endl;for (auto i : nums | std::views::drop(3))std::cout << i << ' '; // 4 5 6 7std::cout << std::endl;;// std::ranges::join_viewconst std::vector<std::vector<int>> v{ {1, 2}, {3, 4, 5}, {6}, {7, 8, 9} };auto jv = std::ranges::join_view(v);
#ifdef __linux__for (int const e : jv)std::cout << e << ' ';std::cout << std::endl;
#endif// std::views::countedconst int a[]{ 1, 2, 3, 4, 5, 6, 7 };for (int i : std::views::counted(a, 3))std::cout << i << ' '; // 1 2 3std::cout << std::endl;// std::views::elementsconst std::vector<std::tuple<int, char>> vt {{1, 'A'},{2, 'B'},{3, 'C'},{4, 'D'},{5, 'E'}};for (int const e : std::views::elements<0>(vt))std::cout << e << ' '; // 1 2 3 4 5std::cout << std::endl;for (char const e : vt | std::views::elements<1>)std::cout << e << ' '; // A B C D Estd::cout << std::endl;return 0;
}
执行结果如下图所示:
3.customization point objects:
(1).std::ranges::begin、std::ranges::cbegin:返回指向range开头的迭代器。
(2).std::ranges::end、std::ranges::cend:返回指示range结束的哨兵(sentinel)。
(3).std::ranges::rbegin、std::ranges::crbegin:返回range的反向迭代器。
(4).std::ranges::rend、std::ranges::crend:返回range的反向结束迭代器。
(5).std::ranges::size:返回等于range大小的整数。
(6).std::ranges::ssize:返回等于range大小的有符号整数。
(7).std::ranges::empty:检查range是否为空。
(8).std::ranges::data、std::ranges::cdata:获取指向连续range开头的指针。
int test_ranges_customization_point_objects()
{// std::ranges::beginstd::vector v{ 3, 1, 4, 9, 6};auto vi = std::ranges::begin(v);std::cout << *vi << std::endl; // 3*(++vi) = 66;std::cout << v[1] << std::endl; // 66// std::ranges::endvi = std::ranges::end(v);std::cout << *(vi-1) << std::endl; // 6*(--vi) = 88;std::cout << v[4] << std::endl; // 88for (auto vi = std::ranges::cbegin(v); vi != std::ranges::end(v); ++vi)std::cout << *vi << " "; // 3 66 4 9 88std::cout << std::endl;// std::ranges::rbeginauto vj = std::ranges::rbegin(v);std::cout << *vj << std::endl; // 88*(++vj) = 33;std::cout << v[3] << std::endl;// std::ranges::rendvj = std::ranges::rend(v);std::cout << *(vj-1) << std::endl; // 3*(--vj) = 99;std::cout << v[0] << std::endl; // 99// std::ranges::sizestd::cout << "size:" << std::ranges::size(v) << ",ssize:" << std::ranges::ssize(v) << std::endl; // size:5,ssize:5// std::ranges::emptystd::cout << "v is empty:" << std::ranges::empty(v) << std::endl; // v is empty:0std::map<int, std::string> m{};std::cout << "m is empty:" << std::ranges::empty(m) << std::endl; // m is empty:1std::string str{ "hello world!" };std::ranges::data(str)[0] = 'H';std::cout << std::ranges::data(str) << std::endl; // Hello world!return 0;
}
执行结果如下图所示:
GitHub:https://github.com/fengbingchun/Messy_Test
相关文章:

C++20中头文件ranges的使用
<ranges>是C20中新增加的头文件,提供了一组与范围(ranges)相关的功能,此头文件是ranges库的一部分。包括: 1.concepts: (1).std::ranges::range:指定类型为range,即它提供开始迭代器和结束标记(it provides a begin iterato…...

设计一个html+css+js的注册页,对于注册信息进行合法性检测
综合使用HTML、JavaScript和CSS进行注册页面设计,实现以下若干功能: 注意整个页面的色调和美观使用FramesetTable布局(div也可)对用户ID和用户名、口令不符合条件及时判断对口令不一致进行及时判断(34的及时判断&#…...

语音识别——使用Vosk进行语音识别
文章目录 前言一、Vosk模型1.准备好所需要的语音包2.下载使用 二、使用示例1.文件读取示例2.结合麦克风演示 总结 前言 如何编译Vosk请参照之前的文章,ubuntu编译kaldi和vosk Vosk是语音识别开源框架,支持二十种语言 - 中文,英语࿰…...
element ui中el-image组件查看图片的坑
比如说上传组件使用el-image-viewer组件去看,如果用错了,你会发现,你每次只能看一张图片 <template><div><el-upload action="#" list-type="picture-card" :auto-upload="false" :file-list="fileList"@change=&qu…...

LabVIEW水质监测系统
在面对全球性的海洋污染问题时,利用先进技术进行水质监测成为了保护海洋环境的关键手段之一。开发了一种基于LabVIEW的海洋浮标水质监测系统,该系统能够实时监测并评估近海水域的水质状况,旨在为海洋保护和污染防治提供科技支持。 项目背景 …...

SpringMVC之 文件上传和下载
1. 文件上传 1.1 前端注意事项 文件上传操作,前端的表单项需要如下三项设置: (1)input标签的type属性应设置为file,并且注意不要在input标签中设置value属性,因为这可能导致文件上传不成功; …...
LeetCode Hot 100:二分查找
LeetCode Hot 100:二分查找 35. 搜索插入位置 思路 1:lower_bound class Solution { public:int searchInsert(vector<int>& nums, int target) {return lower_bound(nums.begin(), nums.end(), target) - nums.begin();} };思路 2…...

打包方式-jar和war的区别
1、jar包 JAR包是类的归档文件,与平台无关的文件格式,其实jar包就是java的类进行编译生成的class文件进行打包的压缩包。 JAR以ZIP文件格式为基础,与ZIP不同的是,JAR不仅用于压缩和发布,还用于部署和封装库、组件和插…...

【论文+源码】基于spring boot的垃圾分类网站
创建一个基于Spring Boot的垃圾分类网站涉及多个步骤,包括环境搭建、项目创建、数据库设计、后端服务开发、前端页面设计等。下面我将引导您完成这个过程。 第一步:准备环境 确保您的开发环境中安装了以下工具: Java JDK 8 或更高版本Mav…...

【C++ STL 模板类】pair 键值对
文章目录 【 1. pair 对象的创建 】【 2. pair 对象的赋值 】【 3. pair 对象的比较 】【 4. pair对象成员的互换】 C STL 标准库提供了 pair 类模板,专门用来将 2 个普通元素 first 和 second(可以是 C 基本数据类型、结构体、类自定的类型)…...

paddleocr使用FastDeploy 部署工具部署 rknn 模型
在 PC 端转换 pdmodel 模型为 rknn 模型和在板端使用百度飞浆开发的 FastDeploy 部署工具部署 rknn 模型 以下内容是在 PC 端系统为 Ubuntu20.04,板端系统为ubuntu20.04 的环境下实现的 描述: 官网地址 rknn_zoo RKNPU2_SDK …...

Apple Vision Pro市场表现分析:IDC最新数据揭示的真相
随着AR/VR技术逐渐成熟并被更多消费者接受,2024年第二季度(Q2)成为这一领域的一个重要转折点。根据国际数据公司(IDC)发布的最新报告,整个AR/VR市场在本季度经历了显著的增长。接下来,我们将深入探讨Apple Vision Pro在这股增长浪潮中的具体表现。 市场背景 2024年Q2,…...

Mybatis-04.入门-JDBC
一.JDBC 二.原始的JDBC程序代码 (不做要求) Test public void testJdbc() throws Exception {//1. 注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//2. 获取连接对象String url "jdbc:mysql://localhost:3306/mybatis";Str…...
拥抱云开发的未来:腾讯云数据库、云模板与AI智能化的应用场景探索
本文目录: 💡前言:技术的边界在不断延展🌟目录🌈什么是腾讯云云开发?💾云数据库:让数据成为开发的稳固基石🥑数据,不再只是数据 🛠云模板…...

新手铲屎官求推荐,噪音低的宠物空气净化器应该用哪款
当初选择养橘猫就是因为我听到有人说橘猫不容易掉毛才养的,谁知道养了之后和传闻中的不一样,真正的让我明白了什么叫“眼见为实”。 主要是猫掉毛就掉毛,只要我能清理的我都会清理,只要能保证养猫的同时还能保持家里卫生干净就行…...

玄机平台-应急响应-webshell查杀
首先xshell连接 然后进入/var/www/html目录中,将文件变成压缩包 cd /var/www/html tar -czvf web.tar.gz ./* 开启一个http.server服务,将文件下载到本地 python3 -m http.server 放在D盾中检测 基本可以确认木马文件就是这四个 /var/www/html/shell.p…...
LeetCode Hot 100:图论
LeetCode Hot 100:图论 200. 岛屿数量 思路 1:深度优先搜索 class Solution { private:const int dx[4] {-1, 0, 1, 0};const int dy[4] {0, 1, 0, -1};public:int numIslands(vector<vector<char>>& grid) {if (grid.empty())retu…...
tracert和ping的区别
1、简介 tracert(在 Windows 系统中)和 traceroute(在 Unix/Linux 系统中)以及 ping 都是网络诊断工具,但它们的功能和用途有所不同: ping: 用途:ping 是一个网络工具&…...
回归、分类模型的评估指标
1. 分类模型的评估指标 评估机器学习模型的好坏至关重要,它帮助我们判断模型的性能、稳定性以及在实际问题中的应用效果。不同类型的机器学习任务(分类、回归、聚类等)有不同的评估指标。以下是详细介绍常见的模型评估指标,尤其针…...
k8s中如何将pod的标准输出日志输出到一个文件
假设容器的启动命令是 grpcserver,我们将通过修改启动命令,将 grpcserver 的标准输出重定向到指定的日志文件 /var/log/app/grpcserver.log,同时保留标准输出以便 Kubernetes 日志系统仍然能够捕获日志。 目标: 将 grpcserver 的…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...