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 range
    int* begin();
    int* end();
};

struct NotRange { // not a range: begin does not return an input_or_output_iterator
    void* begin();
    int* end();
};

} // namespace

int test_ranges_concepts()
{
#ifdef _MSC_VER
	static_assert(std::ranges::range<SimpleRange>);
	static_assert(!std::ranges::range<NotRange>);
#endif

	static_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::subrange
	const 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_view
	std::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_view
	constexpr 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:1

	std::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_view
	for (auto i : std::ranges::iota_view{ 1, 10 })
		std::cout << i << ' '; // 1 2 3 4 5 6 7 8 9
	std::cout << std::endl;

	for (auto i : std::ranges::views::iota(1, 10))
		std::cout << i << ' '; // 1 2 3 4 5 6 7 8 9
	std::cout << std::endl;

	// std::ranges::views::istream
	auto 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::all
	const 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 5
	std::cout << std::endl;

	// std::ranges::take_view,std::ranges::ref_view
	const 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:5
	const 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_Test
	for (const auto c : rv)
		std::cout << c; // Messy
	std::cout << std::endl;

	// std::ranges::owning_view
	using 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::drop
	const 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 7
	std::cout << std::endl;

	for (auto i : nums | std::views::drop(3))
		std::cout << i << ' '; // 4 5 6 7
	std::cout << std::endl;;

	// std::ranges::join_view
	const 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::counted
	const int a[]{ 1, 2, 3, 4, 5, 6, 7 };
	for (int i : std::views::counted(a, 3))
		std::cout << i << ' '; // 1 2 3
	std::cout << std::endl;

	// std::views::elements
	const 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 5
	std::cout << std::endl;

	for (char const e : vt | std::views::elements<1>)
		std::cout << e << ' '; // A B C D E
	std::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::begin
	std::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::end
	vi = std::ranges::end(v);
	std::cout << *(vi-1) << std::endl; // 6
	*(--vi) = 88;
	std::cout << v[4] << std::endl; // 88

	for (auto vi = std::ranges::cbegin(v); vi != std::ranges::end(v); ++vi)
		std::cout << *vi << " "; // 3 66 4 9 88
	std::cout << std::endl;

	// std::ranges::rbegin
	auto vj = std::ranges::rbegin(v);
	std::cout << *vj << std::endl; // 88
	*(++vj) = 33;
	std::cout << v[3] << std::endl;

	// std::ranges::rend
	vj = std::ranges::rend(v);
	std::cout << *(vj-1) << std::endl; // 3
	*(--vj) = 99;
	std::cout << v[0] << std::endl; // 99

	// std::ranges::size
	std::cout << "size:" << std::ranges::size(v) << ",ssize:" << std::ranges::ssize(v) << std::endl; // size:5,ssize:5

	// std::ranges::empty
	std::cout << "v is empty:" << std::ranges::empty(v) << std::endl; // v is empty:0
	std::map<int, std::string> m{};
	std::cout << "m is empty:" << std::ranges::empty(m) << std::endl; // m is empty:1

	std::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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

博弈论 C++

前置知识 若一个游戏满足&#xff1a; 由两名玩家交替行动在游戏进行的任意时刻&#xff0c;可以执行的合法行动与轮到哪位玩家无关不能行动的玩家判负 则称该游戏为一个公平组合游戏。 尼姆游戏&#xff08;NIM&#xff09;属于公平组合游戏&#xff0c;但常见的棋类游戏&…

idea(2017版)创建项目的搭建方式

目录 一、普通Java项目 二、普通JavaWeb项目 三、maven的Java项目 四、maven的JavaWeb项目 一、普通Java项目 1.创建新项目 2.因为是普通的java项目&#xff0c;所以先点最上面的Java&#xff0c;然后确定jdk&#xff0c;然后next 3.这里直接点next 4.写好项目名称和路径…

互联网系统的微观与宏观架构

互联网系统的架构设计&#xff0c;通常会根据项目的体量、业务场景以及技术需求被划分为微观架构&#xff08;Micro-Architecture&#xff09;和宏观架构&#xff08;Macro-Architecture&#xff09;。这两者的概念与职责既独立又相互关联。本文将通过一些系统案例&#xff0c;…

Vue3 学习笔记(五)Vue3 模板语法详解

在 Vue3 的世界里&#xff0c;模板语法是我们构建用户界面的基石。今天&#xff0c;让我们一起深入了解 Vue3 的模板语法&#xff0c;我将用通俗易懂的语言和实用的例子&#xff0c;带你掌握这项必备技能。 1、文本插值&#xff1a;最基础的开始 想在页面上显示数据&#xff1f…

《探索 HarmonyOS NEXT(5.0):开启构建模块化项目架构奇幻之旅 —— 模块化基础篇》

从无到有&#xff0c;打造模块化项目。构建一个开箱即用的项目&#xff0c;从 Git 上拉取下来即可直接进行开发&#xff0c;其中涵盖路由通信、上下拉刷新、网络请求、事件通知、顶部tab封装等功能&#xff0c;项目里调用API为鸿洋大佬的wanAndroidAPI。后期将持续完善&#xf…

【C】数组(array)

数组(array) 数组的概念 数组是一组相同类型元素的集合 数组中存放的是1个或者多个数据&#xff0c;但是数组元素个数不能为0数组中存放的多个数据&#xff0c;类型是相同的 数组分为一维数组和多维数组&#xff0c;多维数组一般比较多见的是二维数组 一维数组的创建和初始…

JAVA面试八股文(五)

#1024程序员节&#xff5c;征文# 在1024程序员节这个特别的日子里&#xff0c;首先&#xff0c;我想对每一位程序员表示最诚挚的祝贺&#xff01;祝愿大家在未来的日子里&#xff0c;能够继续热爱编程、追求卓越&#xff0c;携手共创更美好的科技未来&#xff01;让我们共同庆祝…

Redis Search系列 - 第六讲 基准测试 - Redis Search VS. MongoDB VS. ElasticSearch

目录 一、引言二、Redis Search 2.x版本的性能提升三、Redis Search VS. MongoDB VS. ElasticSearch3.1 测试环境3.2 100%写 - 基准测试3.3 100%读 - 基准测试3.4 混合读/写/搜索 - 基准测试2.5 搜索延迟分析3.6 读延迟分析3.7 写延迟分析3.8 Redis Search VS. ElasticSearch3.…

混个1024勋章

一眨眼毕业工作已经一年了&#xff0c;偶然进了游戏公司成了一名初级游戏服务器开发。前两天总结的时候&#xff0c;本来以为自己这一年没学到多少东西&#xff0c;但是看看自己的博客其实也有在进步&#xff0c;虽然比不上博客里的众多大佬&#xff0c;但是回头看也算是自己的…

micro-app【微前端实战】主应用 vue3 + vite 子应用 vue3+vite

micro-app 官方文档为 https://micro-zoe.github.io/micro-app/docs.html#/zh-cn/framework/vite 子应用 无需任何修改&#xff0c;直接启动子应用即可。 主应用 1. 安装微前端框架 microApp npm i micro-zoe/micro-app --save2. 导入并启用微前端框架 microApp src/main.ts …

手机摄影入门

感觉会摄影的人是能够从生活中发现美的人。 我不太会拍照&#xff0c;觉得拍好的照片比较浪费时间&#xff0c;而且缺乏审美也缺乏技巧&#xff0c;所以拍照的时候总是拍不好。但有时候还是需要拍一些好看的照片的。 心态和审美可能需要比较长时间提升&#xff0c;但一些基础…

Apple Vision Pro市场表现分析:IDC最新数据揭示的真相

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

中航资本:股票支撑位和压力位什么意思?股票如何找支撑与压力?

股票支撑位和压力位什么意思&#xff1f; 支撑位是指股票价格在下跌过程中遇到的一个或多个价格方位&#xff0c;这些价位上存在着较强的买盘力气&#xff0c;可以提供满足的支撑&#xff0c;阻止股价继续下跌。 而股票压力位是指股票价格在上涨过程中遇到的一个或多个价格方…

docker部署rustdesk

文章目录 一.ubuntu修改ssh端口二.开放端口三.安装rustDesk四.连接验证 一.ubuntu修改ssh端口 借鉴乌班图Ubuntu 24.04 SSH Server 修改默认端口重启无效 https://bugs.launchpad.net/ubuntu/source/openssh/bug/2069041 sudo vim /etc/ssh/sshd_config sudo systemctl daem…

在windows下利用安装docker加vscode调试OceanBase,

文章目录 一、安装WSL二、安装docker三、 OceanBase安装 -- 运行镜像&#xff0c;配置VScode四、 OceanBase安装 -- 将获取到的文件与docker容器 映射连接 – 参考官方文档 docker安装 在windows上通过docker配置环境并利用vscode调试代码 一、安装WSL 1.可以在任务管理器中&…

⌈ 传知代码 ⌋ 农作物病害分类(Web端实现)

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

我谈椒盐噪声的统计模型

在成像系统发展长河的早期&#xff0c;椒盐噪声曾经不可避免&#xff0c;但是如今&#xff0c;即使在专用成像设备中&#xff08;如遥感、医学&#xff09;&#xff0c;椒盐噪声也属罕见了。所以&#xff0c;现在在图像处理领域&#xff0c;研究椒盐噪声的去除没有多少实际意义…

kafka 如何减少数据丢失?

大家好&#xff0c;我是锋哥。今天分享关于【kafka 如何减少数据丢失?】面试题&#xff1f;希望对大家有帮助&#xff1b; kafka 如何减少数据丢失? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Apache Kafka 是一个高吞吐量的分布式消息队列&#xff0c;广泛用…

R实验——logistic回归、LDA、QDAKNN

数据集介绍&#xff1a; mpg&#xff0c;miles per gallon即油耗&#xff0c;这个数据集来自卡内基梅隆大学维护的StatLib库。1983年美国统计协会博览会使用了该数据集。这个数据集是对StatLib库中提供的数据集稍加修改的版本。根据Ross Quinlan(1993)在预测属性“mpg”中的使…

python-PyQt项目实战案例:制作一个视频播放器

文章目录 1. 关键问题描述2. 通过OpenCV读取视频/打开摄像头抓取视频3. 通过PyQt 中的 QTimer定时器实现视频播放4. PyQt 视频播放器实现代码参考文献 1. 关键问题描述 在前面的文章中已经分享了pyqt制作图像处理工具的文章&#xff0c;也知道pyqt通过使用label控件显示图像的…