C++(17):标准库特殊设施

news2024/11/17 2:53:30

tuple 类型

tuple是类似pair的模板。
每个pair的成员类型都不相同,但每个 pair都恰好有两个成员。不同tuple类型的成员类型也不相同,但一个tuple可以有任意数量的成员。
每个确定的tuple类型的成员数目是固定的,但一个tuple类型的成员数目可以与另一个tuple类型不同。

tuple 类型及其伴随类型和函数都定义在tuple头文件中。tuple支持地操作如下:

在这里插入图片描述

定义和初始化 tuple

希望将一些数据组合成单一对象,但又不想麻烦地定义一个新数据结构来表示这些数据时,tuple是非常有用的。

tuple<size_t, size_t, size_t> threeD;//三个成员都设置为0
tuple<string, vector<double>, int, list<int>> someval("constants"{3.142.718},42{0,1,2,3,4,5})

必须使用直接初始化语法:tuple的这个构造函数是explicit

tuple<size_t, size_t, size_t> threeD={1,2,3);	//错误
tuple<size_t, size_t, size_t> threeD{1,2,3};	//正确

类似于 make_pair ,标准库定义了 make_tuple 函数,可以生成 tuple 对象:

auto item = make_tuple("0-999-78345-X", 3, 20.00);

访问 tuple 的成员
tuple的成员都是未命名的:因为一个tuple类型的成员数目是没有限制的。

要访问一个tuple的成员,就要使用一个名为get的标准库函数模板。

auto book = get<0>(item);	//返回 item 的第一个成员
auto cnt = get<1>(item);	//返回 item 的第二个成员
auto price = get<2>(item)/cnt;	//返回 item 的最后一个成员
get<2>(item)*=0.8;	//打折20%

尖括号中的值必须是一个整型常量表达式

如果不知道一个tuple准确的类型细节信息,可以用两个辅助类模板来查询tuple成员的数量和类型:

typedef decltype(item) trans;	//trans是 item的类型
//返回trans类型对象中成员的数量
size_t sz = tuple_size<trans>::value; //返回3
// cnt 的类型与 item 中第二个成员相同
tuple_element<1,trans>::type cnt = get<1>(item); // cnt 是一个 int

确定一个对象的类型的最简单方法就是使用decltype

tuple_size有一个名为valuepublic static 数据成员,它表示给定tuple中成员的数量。
tuple_element模板除了一个tuple类型外,还接受一个索引值。它有一个名为typepublic类型成员,表示给定tuple类型中指定成员的类型。类似gettuple_element所使用的索引也是从0开始计数的。

关系和相等运算符
只有两个tuple具有相同数量的成员时,才可以比较它们。
而且,为了使用tuple的相等或不等运算符,对每对成员使用==运算符必须都是合法的;为了使用关系运算符,对每对成员使用<必须都是合法的。

使用 tuple 返回多个值

tuple的一个常见用途是从一个函数返回多个值。
一些使用嵌套 pair 的地方可以使用 tuple 来代替。

bitset 类型

标准库定义了bitset类,使得位运算的使用更为容易,并且能够处理超过最长整型类型大小的位集合。bitset类定义在头文件bitset中。

定义和初始化 bitset

bitset类是一个类模板,类似array类,具有固定的大小。定义一个bitset时,需要声明它包含多少个二进制位,大小必须是一个常量表达式:

bitset<32> bitvec(1U) //32 位;低位位1,其他位为 0
//定义bitvec为一个包含32位的 bitset

二进制位的位置是从0开始编号的。因此,bitvec包含编号从03132个二进制位。编号从0开始的二进制位被称为低位,编号到31结束的二进制位被称为高位。

初始化 bitset 的方法有:
在这里插入图片描述
用 unsigned 值初始化 bitset
当我们使用一个整型值来初始化bitset时,此值将被转换为unsigned long long类型并被当作位模式来处理。bitset中的二进制位将是此模式的一个副本。
如果bitset的大小大于一个unsigned long long 中的二进制位数,则剩余的高位被置为0
如果bitset的大小小于一个unsigned long long 中的二进制位数,则只使用给定值中的低位,超出bitset大小的高位被丢弃。

从一个 string 初始化 bitset
我们可以从一个string或一个字符数组指针来初始化bitset。两种情况下,字符都直接表示位模式。
与往常一样,当我们使用字符串表示数时,字符串中下标最小的字符对应高位,反之亦然。
如果string包含的字符数比bitset少,则bitset的高位被置为0。

string的下标编号习惯与bitset恰好相反:string中下标最大的字符(最右字符)用来初始化bitset中的低位(下标为0的二进制位)。

bitset 操作

在这里插入图片描述
提取 bitset 的值
to_ulongto_ullong操作都返回一个值,保存了与bitset对象相同的位模式。
只有当bitset的大小小于等于对应的大小(to_ulongunsigned long,to_ullongunsigned long long)时,才能使用这两个操作。
如果 bitset中的值不能放入给定类型中,则这两个操作会抛出一个overflow_error异常。

bitset 的 IO 运算符
输入运算符从一个输入流读取字符,保存到一个临时的string对象中。直到读取的字符数达到对应bitset的大小时,或是遇到不是10的字符时,或是遇到文件尾或输入错误时,读取过程才停止。
随即用临时string对象来初始化bitset。如果读取的字符数小于bitset 的大小,则与往常一样,高位将被置为0

正则表达式

正则表达式是一种描述字符序列的方法,是一种极其强大的计算工具。C++ 的正则表达式库(RE库)定义在头文件 regex 中。

正则表达式库组件
在这里插入图片描述

使用正则表达式库

regex_search 和 regex_match

//这两个操作返回都是 bool 值
regex_match(seq, m, r, mft);   //如果整个字符序列 seq 与 regex 对象 r 中的正则表达式匹配就返回 true。
regex_search(seq, m, r, mft);  //如果输入序列 seq 中的一个子串与 regex 对象 r 中的正则表达式匹配就返回 true
//seq 可以是一个 string、字符指针或是一对表示范围的迭代器
//上面的参数 m 和 mft 都可以省略。m 是一个 match 对象,用来保存匹配结果的相关细节。
// i 除非在 c 之后,否则必须在 e 之前
//查找不在字符c之后的字符串eistring pattern("['c]ei");
//我们需要包含pattern的整个单词
pattern = "[[:alpha:]] *"+pattern + "[[ :alpha:]]*";
regex r(pattern);	//构造一个用于查找模式的 regex
smatch results;		//定义一个对象保存搜索结果
//定义一个 string 保存与模式匹配和不匹配的文本
string test_str = "receipt freind theif receive";
//用 r 在 test_str 中查找与 pattern 匹配的子串
if (regex_search(test_str,results,r))//如果有匹配子串
	cout <<results.str()<<endl;//打印匹配的单词

//首先定义了一个string来保存希望查找的正则表达式。正则表达式[^c]表明我们希望匹配任意不是' c'的字符,而[^c]ei指出我们想要匹配这种字符后接ei的字符串。
//此模式描述的字符串恰好包含三个字符。我们想要包含此模式的单词的完整内容。
//为了与整个单词匹配,我们还需要一个正则表达式与这个三字母模式之前和之后的字母匹配。

//这个正则表达式包含零个或多个字母后接我们的三字母的模式,然后再接零个或多个额外的字母。
//默认情况下,regex使用的正则表达式语言是ECMAScript。
//在 ECMAScript中,模式[[::alpha:]] 匹配任意字母,符号+和*分别表示我们希望“一个或多个”或‘零个或多个”匹配。因此 [[::alpha:]]*将匹配零个或多个字母。

随机数

传统生成随机数的方法:rand()
生成结果:一个伪随机整数,范围在 0 到一个与系统相关的最大值之间
存在的问题:生成其他范围需要程序员来手动转换,常引入非随机性。

C++ 新标准的方法:使用随机数引擎类和随机数分布类协作来生成
引擎: 类型,生成 unsigned 随机数序列
分布: 类型,使用引擎生成指定类型的、在给定范围内的、服从特定概率分布的随机数

随机数引擎和分布

随机数引擎是函数对象类,它们定义了一个调用运算符,该运算符不接受参数并返回一个随机 unsigned 整数。
可以通过调用一个随机数引擎对象来生成原始随机数:

default_random_engine e;	//生成随机无符号数
for (size_t i=0; i<10; ++i)
	// e()“调用”对象来生成下一个随机数
	cout << e() << " ";

标准库定义了多个随机数引擎类,区别在于性能和随机性质量不同。每个编译器都会指定其中一个作为default_random_engine类型。此类型一般具有最常用的特性。

随机数引擎操作
在这里插入图片描述
分布类型和引擎

//为了得到在一个指定范围内的数,我们使用一个分布类型的对象:
//生成0到9之间(包含)均匀分布的随机数
uniform_int_distribution<unsigned> u(0,9);
default random engine e;	//生成无符号随机整数
for (size_t i=0; i<10; ++i)
	//将u作为随机数源
	//每个调用返回在指定范围内并服从均匀分布的值
	cout << u(e) <<" ";

类似引擎类型,分布类型也是函数对象类。分布类型定义了一个调用运算符,它接受一个随机数引擎作为参数。分布对象使用它的引擎参数生成随机数,并将其映射到指定的分布。

一般情况下,说随机数发生器时,是指分布对象和引擎对象的组合。

一个给定的随机数发生器一直会生成相同的随机数序列。
一个函数如果定义了局部的随机数发生器,应该将其(包括引擎和分布对象)定义为static的。否则,每次调用函数都会生成相同的序列。

设置随机数发生器种子:引擎可以利用它从序列中一个新位置重新开始生成随机数。每次运行程序都会生成不同的随机结果。
为引擎设置种子有两种方式:1.在创建引擎对象时提供种子;2.调用引擎的seed成员。

default_random_engine e1(time(0));//稍微随机些的种子

如果程序作为一个自动过程的一部分反复运行,将time 的返回值作为种子的方式就无效了;它可能多次使用的都是相同的种子。

随机数引擎生成unsigned 数,范围内的每个数被生成的概率都是相同的。

分布类型的操作
在这里插入图片描述由于引擎返回相同的随机数序列,所以必须在循环外声明引擎对象。否则,每步循环都会创建一个新引擎,从而每步循环都会生成相同的值。类似的,分布对象也要保持状态,因此也应该在循环外定义。

IO库再探

IO 库的三个特殊的特性:格式控制、未格式化IO、随机访问

格式化输入和输出

除了条件状态外,每个 iostream 对象还维护一个格式状态来控制 IO 如何格式化的细节:整型值是几进制、浮点值的精度、一个输出元素的宽度等。

标准库定义了一组操纵符来修改流的格式状态:一个操纵符是一个函数或是一个对象,会影响流的状态,并能用作输入或输出运算符的运算对象。

操纵符改变格式状态
操纵符用于两大类输出控制:控制数值的输出形式以及控制补白的数量和位置。
大多数改变格式状态的操纵符都是设置/复原成对的;一个操纵符用来将格式状态设置为一个新值,而另一个用来将其复原,恢复为正常的默认格式。
当操纵符改变流的格式状态时,通常改变后的状态对所有后续 IO 都生效。

控制布尔值的格式
操纵符改变对象的格式状态的一个例子是 boolalpha操纵符。默认情况下,bool值打印为10。一个true值输出为整数1,而false输出为0
可以通过对流使用boolalpha操纵符来覆盖这种格式:

cout<< "default bool values: " << true<< " " << false
	<< "\nalpha bool values: "<<boolalpha
	<< true << " " << false <<endl;

//<<default bool values: 1 0
//<<alpha bool values: true false


bool bool_val = get_status ();
cout << boolalpha //设置cout的内部状态
	<<bool val
	<<noboolalpha;	//将内部状态恢复为默认格式

指定整型值的进制
默认情况下,整型值的输入输出使用十进制。可以使用操纵符hexoctdec将其改为十六进制、八进制或是改回十进制:

cout << 20;         // 输出 10 进制
cout << oct << 20;  // 输出 8 进制
cout << hex << 20;  // 输出 16 进制
cout << dec << 20;  // 恢复十进制

操纵符hexoctdec只影响整型运算对象,浮点值的表示形式不受影响。

在输出中指出控制
在输出中指定进制:showbasenoshowbase
控制字母大小写:uppercase, nouppercase

前导0x表示十六进制。
前导0表示八进制。
无前导字符串表示十进制。

cout << showbase << hex << 30;  // 打印 0x1e
cout << uppercase << 30;        // 打印 0X1E

控制浮点数格式
从三个方面设置浮点数格式:
1.以多高精度打印,精度控制的是打印的字数的总数。默认为总共打印 6 位数字;
2.打印为十六进制、定点十进制还是科学计数法形式。默认十进制,很大或很小时为科学计数法,其他为定点十进制;
3.没有小数部分的浮点值是否打印小数点。默认不打印小数点。

指定打印精度
除了操纵符 setprecision() 还可以调用 IO 对象的 precision() 成员来指定精度或获取当前精度。

cout << setprecision(4) << 3.1415;     // 设置精度为 4 位,打印 3.142
cout << cout.precision();              // 打印当前精度:4
cout.precision(6);                     // 设置精度为 6 位

setprecision() 本来控制的是数字的整体精度(而不是小数位数),如果同时也用上 fixed,setprecision() 指定的就是小数位数了。

cout << fixed << setprecision(2) << 3.1415;  // 设置小数位数为 2 位,打印 3.14

打印小数点
默认情况下,当一个浮点值的小数部分为0时,不显示小数点。showpoint 操纵符强制打印小数点:

cout << 10.0 << endl;	//打印10
cout << showpoint << 10.0	//打印10.0000
<< noshowpoint << endl;	// 恢复小数点的默认格式

输出补白
setw(n):指定下一个数字或字符串值的最小空间
left:左对齐输出
right:右对齐输出。默认为右对齐
internal:控制负数的符号位置:左对齐符号,右对齐值,中间为空格
setfill('#'):指定用 '#' 代替空格来补白。

注意到 setw(n) 是一个例外,不改变格式状态,只决定下一个输出的大小。

在这里插入图片描述
控制输入格式
默认情况下,输入运算符会忽略空白符(空格符、制表符、换行符、换纸符和回车符)。
操纵符noskipws会令输入运算符读取空白符,而不是跳过它们;为了恢复默认行为,可以使用skipws操纵符。

未格式化的输入/输出操作

标准库还提供了一组低层操作,支持未格式化IO。这些操作允许将一个流当作一个无解释的字节序列来处理。

单字节操作
在这里插入图片描述
将字符放回输入流
有时需要读取一个字符才能知道还未准备好处理它。这种情况下,希望可以将字符放回流中。

标准库提供了三种方法退回字符,它们有着细微的差别:
1.peek返回输入流中下一个字符的副本,但不会将它从流中删除,peek 返回的值仍然留在流中;
2.unget使得输入流向后移动,从而最后读取的值又回到流中。即使不知道最后从流中读取什么值,仍然可以调用unget
3.putback是更特殊版本的unget:它退回从流中读取的最后一个值,但它接受个参数,此参数必须与最后读取的值相同。

一般情况下,在读取下一个值之前,标准库保证我们可以退回最多一个值。即,标准库不保证在中间不进行读取操作的情况下能连续调用putbackunget

从输入操作返回的 int 值
peek() 和无参 get() 都以 int 类型从输入流返回一个字符。
这些函数返回一个int的原因是:可以返回文件尾标记。
返回 int 要先将返回的字符转换为 unsigned char,然后将结果提升到 int

即使字符集中有字符映射到负值,这些操作返回的int也是正值

多字节操作
有一些未格式化 IO 操作一次处理大块数据,速度相比于普通输入输出更快。

在这里插入图片描述
在这里插入图片描述

流随机访问

各种流类型通常都支持对流中数据的随机访问。

重要术语

bitset 标准库类,保存二进制位集合,大小在编译时已知,并提供检测和设置集合中二进制位的操作。

cmatch csub_match 对象的容器,保存一个 regex 与一个 const char* 输入序列匹配的相关。

smatch ssub_match对象的容器,提供—个regex与一个string输入序列匹配的相关信息。容器首元素描述了整个匹配结果。后续元素描述了子表达式的匹配结果。

cregex_iterator 类似sregex_iterator,唯一的差别是此迭代器遍历一个char 数组。

csub_match 保存一个正则表达式与一个const char*匹配结果的类型。可以表示整个匹配或子表达式的匹配。

未格式化IO 将流当作无差别的字节流来处理的操作。未格式化操作给用户增加了很多管理IO的负担。

正则表达式 一种描述字符序列的方式。

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

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

相关文章

OS 死锁处理

如果P先申请mutex 则mutex从1置零&#xff0c;假设申请到的empty 0则empty变成-1阻塞态 同理C中mutex从0变为-1&#xff0c;那么如果想离开阻塞态&#xff0c;那么就需要执行V&#xff08;empty&#xff09;但是如果执行V&#xff08;empty&#xff09;就需要P&#xff08;mu…

postgresql-窗口函数

postgresql-窗口函数 简介窗口函数的定义分区选项&#xff08;PARTITION BY&#xff09;排序选项&#xff08;ORDER BY&#xff09;窗口选项&#xff08;frame_clause&#xff09; 聚合窗口函数排名窗口函数演示了 CUME_DIST 和 NTILE 函数 取值窗口函数 简介 常见的聚合函数&…

飞致云开源社区月度动态报告(2023年8月)

自2023年6月起&#xff0c;中国领先的开源软件公司FIT2CLOUD飞致云以月度为单位发布《飞致云开源社区月度动态报告》&#xff0c;旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况&#xff0c;以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源大屏…

开讲啦!0基础也能玩转飞桨开源社区

作为cs/ai学生&#xff0c;你是否经历过这些至暗时刻&#xff1a; 希望快速入门深度学习&#xff0c;无奈网上到处都是看不懂“黑话”一遍遍计算综测小数点后四位&#xff0c;不断在保研边缘反复横跳看着“洁白如新”的履历叹气&#xff0c;一听到“考研复试”就头皮发麻“0实习…

【ES6】Promise.allSettled的用法

Promise.allSettled() 是一个Promise方法&#xff0c;用于处理一个Promise数组&#xff0c;返回一个新的Promise数组&#xff0c;每个元素对应原始Promise的状态。这个方法可以用于处理多个异步操作&#xff0c;并且能够获取每个操作的结果和状态。 下面是Promise.allSettled(…

基于蛇优化算法优化的BP神经网络(预测应用) - 附代码

基于蛇优化算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于蛇优化算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.蛇优化优化BP神经网络2.1 BP神经网络参数设置2.2 蛇优化算法应用 4.测试结果&#xff1a;5.Matlab代…

ChatGPT~Error1015You are being rate limited

目录 问题背景 问题的原因 下来说说解决方案 总结 问题背景 今天使用Chatgpt的时候突然出现"You are being rate limited"的错误提示。 问题的原因 小问题了&#xff0c;又不是第一次被弄出来了&#xff0c;莫慌。 让我们先看看Chatgpt自己是怎么解释这个问题…

GE Diary 0001

今天是入职GEHC的第一天&#xff0c;虽然是OD岗位&#xff0c;但是员工氛围暂时没感觉有什么差异&#xff0c;领导也很随和。 公司印象&#xff1a;GEHC目前给我的印象是典型的外企&#xff1a;朝九晚五、无需打卡&#xff08;OD岗位需要打本公司的卡&#xff09;、短小精悍的会…

2781. 最长合法子字符串的长度

2781. 最长合法子字符串的长度 C代码&#xff1a;滑动窗口、哈希表 typedef struct{char* str;UT_hash_handle hh; } HashTable;HashTable* head;void AddToHash(char* str) {HashTable* out (HashTable*)malloc(sizeof(HashTable));out->str str;HASH_ADD_STR(head, str…

Opencv基于文字检测去图片水印

做了一个简单的去水印功能&#xff0c;基于文字检测去图片水印。效果如下&#xff1a; 插件功能代码参考如下&#xff1a; using namespace cv::dnn; TextDetectionModel_DB *textDetector0; void getTextDetector() {if(textDetector)return;String modelPath "text_de…

C++ 学习系列 -- const 关键字

C 中引入了 const 关键字&#xff0c;被 const 关键字修饰的变量其值不能修改&#xff0c;是只读的。 一 const 变量的初始化与存储 1. const 变量初始化时就需要赋初值&#xff0c;否则无法编译通过 二 const 与指针 指针常量&#xff1a; 指针所指向的值不可改变&…

Mysql数据库(2)—事务和锁

一、事务 数据库事务的特性&#xff1f; 数据库事务的四大特性是ACID。 原子性&#xff1a;就是所有操作要么全不做&#xff0c;要不全做。通过undo日志来实现。一致性&#xff1a;就是在并发情况下数据库由一个状态转移到另一个状态的数据要一致。通过事务的隔离级别来实现…

查询优化器内核剖析第一篇

SQL Server 的查询优化器是一个基于成本的优化器。它为一个给定的查询分析出很多的候 选的查询计划&#xff0c;并且估算每个候选计划的成本&#xff0c;从而选择一个成本最低的计划进行执行。实际上&#xff0c; 因为查询优化器不可能对每一个产生的候选计划进行优化&#xff…

2023-8-31 spfa求最短路

题目链接&#xff1a;spfa求最短路 #include <iostream> #include <cstring> #include <algorithm> #include <queue>using namespace std;const int N 100010;int n, m; int h[N], w[N], e[N], ne[N], idx;int dist[N]; bool st[N];void add(int a…

360勒索病毒:了解最新变种.360,以及如何保护您的数据

引言&#xff1a; 近年来&#xff0c;网络安全威胁不断演变&#xff0c; 360 勒索病毒作为其中的一种恶意软件&#xff0c;已经对许多个人和组织的数据造成了巨大的损失。本文91数据恢复将介绍 360 勒索病毒的特点&#xff0c;探讨恢复被其加密的数据的方法&#xff0c;并分享一…

ctfshow 红包题

前言&#xff1a; 最近一直在搞java很少刷题&#xff0c;看见ctfshow的活动赶紧来复现一波~ ctfshow 红包挑战7 <?php highlight_file(__FILE__); error_reporting(2); extract($_GET); ini_set($name,$value); system("ls ".filter($_GET[1])."" )…

重要变更 | Hugging Face Hub 的 Git 操作不再支持使用密码验证

在 Hugging Face&#xff0c;我们一直致力于提升服务安全性&#xff0c;因此&#xff0c;我们将修改 Hugging Face Hub 的 Git 交互认证方式。 从 2023 年 10 月 1 日 开始&#xff0c;我们将不再接受密码作为命令行 Git 操作的认证方式。我们推荐使用更安全的认证方法&#xf…

敏感接口权限校验

前端校验 &#xff08;从前端或者从token里面拿一下&#xff09;&#xff0c;看一下用户有没有这个页面的权限&#xff08;但是一般不用&#xff0c;因为nodejs也可以写后端&#xff0c;但是放到前端去校验不安全&#xff09; 后端校验 需要梳理敏感数据接口&#xff0c;将这…

R语言图形的组合( par(),layout(),par(fig()) )

引入d.class进行画图 > d.class<-read.csv("D://class.csv",header T) > attach(d.class) > opar<-par(no.readonly TRUE)非常简单的数据&#xff0c;需要可自取 链接&#xff1a;https://pan.baidu.com/s/1zNx5z9JsaaRqFueRgGY3mQ 提取码&#x…

FFDNet-pytorch版本代码训练教程

一、FFDNet-pytorch版本代码下载 (1)FFDNet-pytorch下载 https://download.csdn.net/download/qq_41104871/88233742 (2)FFDNet-pytorch版本代码运行环境配置 https://blog.csdn.net/qq_41104871/article/details/132497008 二、FFDNet-pytorch版本代码训练教程 (1)按…