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

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中新增加的头文件&#xff0c;提供了一组与范围(ranges)相关的功能&#xff0c;此头文件是ranges库的一部分。包括&#xff1a; 1.concepts: (1).std::ranges::range:指定类型为range&#xff0c;即它提供开始迭代器和结束标记(it provides a begin iterato…...

设计一个html+css+js的注册页,对于注册信息进行合法性检测

综合使用HTML、JavaScript和CSS进行注册页面设计&#xff0c;实现以下若干功能&#xff1a; 注意整个页面的色调和美观使用FramesetTable布局&#xff08;div也可&#xff09;对用户ID和用户名、口令不符合条件及时判断对口令不一致进行及时判断&#xff08;34的及时判断&#…...

语音识别——使用Vosk进行语音识别

文章目录 前言一、Vosk模型1.准备好所需要的语音包2.下载使用 二、使用示例1.文件读取示例2.结合麦克风演示 总结 前言 如何编译Vosk请参照之前的文章&#xff0c;ubuntu编译kaldi和vosk Vosk是语音识别开源框架&#xff0c;支持二十种语言 - 中文&#xff0c;英语&#xff0…...

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水质监测系统

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

SpringMVC之 文件上传和下载

1. 文件上传 1.1 前端注意事项 文件上传操作&#xff0c;前端的表单项需要如下三项设置&#xff1a; &#xff08;1&#xff09;input标签的type属性应设置为file&#xff0c;并且注意不要在input标签中设置value属性&#xff0c;因为这可能导致文件上传不成功&#xff1b; …...

LeetCode Hot 100:二分查找

LeetCode Hot 100&#xff1a;二分查找 35. 搜索插入位置 思路 1&#xff1a;lower_bound class Solution { public:int searchInsert(vector<int>& nums, int target) {return lower_bound(nums.begin(), nums.end(), target) - nums.begin();} };思路 2&#xf…...

打包方式-jar和war的区别

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

【论文+源码】基于spring boot的垃圾分类网站

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

【C++ STL 模板类】pair 键值对

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

paddleocr使用FastDeploy 部署工具部署 rknn 模型

在 PC 端转换 pdmodel 模型为 rknn 模型和在板端使用百度飞浆开发的 FastDeploy 部署工具部署 rknn 模型 以下内容是在 PC 端系统为 Ubuntu20.04&#xff0c;板端系统为ubuntu20.04 的环境下实现的 描述&#xff1a; 官网地址 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程序代码 &#xff08;不做要求&#xff09; Test public void testJdbc() throws Exception {//1. 注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//2. 获取连接对象String url "jdbc:mysql://localhost:3306/mybatis";Str…...

拥抱云开发的未来:腾讯云数据库、云模板与AI智能化的应用场景探索

本文目录&#xff1a; &#x1f4a1;前言&#xff1a;技术的边界在不断延展&#x1f31f;目录&#x1f308;什么是腾讯云云开发&#xff1f;&#x1f4be;云数据库&#xff1a;让数据成为开发的稳固基石&#x1f951;数据&#xff0c;不再只是数据 &#x1f6e0;云模板&#xf…...

新手铲屎官求推荐,噪音低的宠物空气净化器应该用哪款

当初选择养橘猫就是因为我听到有人说橘猫不容易掉毛才养的&#xff0c;谁知道养了之后和传闻中的不一样&#xff0c;真正的让我明白了什么叫“眼见为实”。 主要是猫掉毛就掉毛&#xff0c;只要我能清理的我都会清理&#xff0c;只要能保证养猫的同时还能保持家里卫生干净就行…...

玄机平台-应急响应-webshell查杀

首先xshell连接 然后进入/var/www/html目录中&#xff0c;将文件变成压缩包 cd /var/www/html tar -czvf web.tar.gz ./* 开启一个http.server服务&#xff0c;将文件下载到本地 python3 -m http.server 放在D盾中检测 基本可以确认木马文件就是这四个 /var/www/html/shell.p…...

LeetCode Hot 100:图论

LeetCode Hot 100&#xff1a;图论 200. 岛屿数量 思路 1&#xff1a;深度优先搜索 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&#xff08;在 Windows 系统中&#xff09;和 traceroute&#xff08;在 Unix/Linux 系统中&#xff09;以及 ping 都是网络诊断工具&#xff0c;但它们的功能和用途有所不同&#xff1a; ping&#xff1a; 用途&#xff1a;ping 是一个网络工具&…...

回归、分类模型的评估指标

1. 分类模型的评估指标 评估机器学习模型的好坏至关重要&#xff0c;它帮助我们判断模型的性能、稳定性以及在实际问题中的应用效果。不同类型的机器学习任务&#xff08;分类、回归、聚类等&#xff09;有不同的评估指标。以下是详细介绍常见的模型评估指标&#xff0c;尤其针…...

k8s中如何将pod的标准输出日志输出到一个文件

假设容器的启动命令是 grpcserver&#xff0c;我们将通过修改启动命令&#xff0c;将 grpcserver 的标准输出重定向到指定的日志文件 /var/log/app/grpcserver.log&#xff0c;同时保留标准输出以便 Kubernetes 日志系统仍然能够捕获日志。 目标&#xff1a; 将 grpcserver 的…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...