C++之标准库的特殊元素

一、tuple 类型

tuple是类似pair的模板,可以将一些数据组合成单一的对象而不用定义一个新的数据结构。不同tuple类型的成员类型不同,但一个tuple可以有任意数量的成员。tuple的一个常用的用途就是在函数中一次性返回多个值。

1、定义和初始化

定义一个tuple时,需要指出每个成员的类型。其默认构造函数会进行值初始化,而初始值初始化的构造函数是explicit的。

tuple<T1,T2,...,Tn> t;//默认构造函数,值初始化
tuple<T1,T2,...,Tn> t (v1,v2,...,vn);//构造函数是explicit的,直接初始化
make_tuple(v1,v2,...,vn);//返回一个给定初始值初始化的tuple。类型根据初始值自动推断

2、元素的访问

要访问tuple的元素,需要利用到一个名为get的标准库函数模板。见括号内的表达式必须为整型常量表达式。

get<i>(t);//返回t的第i个数据成员的引用。可以是左值引用。

tuple_size<tupleType>::value;//返回尖括号内tuple类型的数据成员的个数

tuple_element<i,tupleType>::type;//返回第i个数据成员的类型

二、bitset 类型

标准库中定义了bitset类,用来实现位运算,且能够处理超过最长整型类型大小的位集合。bitset类定义在头文件bitset中。

1、定义和初始化

bitset类类似于array类,具有固定的大小,因此在定义时需要知名其包含多少个二进制位。

bitset<n> b; //b有n位,每一位都是0,对应的构造函数是constexpr
bitset<n> b(u); //b是unsigned long long 类型的u 的低n位拷贝。如果若是n大于unsigned long long 的大小,超出的部分被置为0
bitset<n> b(s, pos, m, zero, one);//s是string类型,其中的字符只能包含0和1。从pos位置开始拷贝m个字符
bitset<n> b(cp, pos, m, zero, one);//从cp指向的字符数组中拷贝字符


2、操作

b.any();//检测b中是否存1
b.all();//检测b的所有位是否都是1
b.none();//检测b中的位是否都是0
b.count();//b中置位的个数
b.size();//返回b中的位数
b.test(pos);//检测pos位是否是1
b.set(pos,v);//将pos位置为v
b.set();//将b的所有位置位
b.reset(pos);//将b中的pos位复位
b.reset();//将b复位
b.flip(pos);//改变pos位的状态
b.flip();//改变b所有位的状态
b[pos];//访问pos位
b.to_ulong();//返回一个unsigned long 类型的值,其位模式与b相同
b.to_ullong();//返回一个unsigned long long 类型的值,其位模式与b相同
b.to_string(zero,one) //返回一个string,表示b中的位模式
os << b;//将b中的二进制位打印到流os
is >> b;//从is读取字符存入b。当字符不是0,1或者达到b的大小时停止读取

三、正则表达式
 
正则表达式是一种描述字符序列的方法。RE库被定义在regex头文件中。

1、regex组件

表示有一个正则表达式的类。可以使用一个string、一个表示字符范围的迭代器对、一个指向空字符结尾的字符数组指针、一个字符指针、一个花括号包围的字符列表来初始化这个类。

regex r(re);
regex r(re, f);//f指出对象如何处理的标志
r1 = re;
r1.assign(re, f);//与赋值运算符效果相同
r.mark_count();//r中子表达式的数目
r.flags();//返回r的标志集
//定义regex时的标志f
icase   //匹配过程中忽略大小写
nosubs  //不保存匹配的子表达式
optimize  //执行速度优于构造速度
ECMAScript  //使用ECMA-262指定的语法
basic    //使用POSIX基本的正则表达式语法
extended  //使用POSIX扩展的正则表达式语法
awk   //使用POSIX版本的awk语言的语法
grep  //使用POSIX版本的grep语法
egrep  //使用POSIX版本的egrep语法

由于在正则表达式语言中,一些符号存在特殊含义,需要用反斜杠来去除其特殊含义,而在C++中反斜杠也是一个特殊字符,因此也需要使用一个反斜杠来获取一个普通的反斜杠字符。因此,在C++中的正则表达式中,往往需要使用双反斜杠来获取正确的正则表达式中特殊字符的普通含义。例如: . 在正则表达式中表示匹配任意字符,如要使用 \.  表示普通的 . 字符,而在C++中用 \\ 来获取普通的 \  , 一个普通的 . 在C++中正则表达式为 \\. 。 

2、regex_match组件

3、regex_search组件

4、regex_replace组件

5、sregex_iterator组件


四、随机数

定义在头文件random的随机数库通过一组协作的类来解决随机数的产生问题:随机数引擎类和随机数分布类。一个引擎类可以生成unsigned随机数序列,一个分布类可以使引擎类生成指定类型的、在给定范围内的、服从特定概率分布的随机数。

1、随机数引擎

随机数引擎是函数对象类,其定义了一个调用运算符,不接受参数并返回一个无符号整数。随机数引擎和rand函数的区别:随机数引擎生成的无符号整数在一个系统定义的范围,而rand函数生成的随机数范围是在0到RAND_MAX之间。

Engine e; //默认构造函数,使用该引擎类型默认的种子
Engine e(s); // 使用整型值s作为种子
e.seed(s); //使用种子s重置引擎状态
e.min(); //此引擎生成随机数的最小值
e.max(); //此引擎生成随机数的最大值
Engine::result_type //此引擎生成的无符号整型类型
e.discard(u);  //将引擎推进u步,u的类型为unsigned long long


2、随机数分布

随机数引擎产生的随机数是原始的随机数,往往不不符合我们的需求,因此需要对其进行转换以满足要求。而随机数分布类就是解决这个问题的。分布类型也是一个函数对象类,分布类型定义了一个调用运算符,接受一个随机数引擎作为参数,将原始随机数映射到指定的分布。

随机数引擎类型和随机数分布类型组合起来称之为随机数发生器。一个给定的随机数发生器一直产生相同的随机数序列。可以将其定义成static类型,以消除该现象。也可以通过设置随机种子来避免:在创建引擎对象时提供种子;调用引擎的seed成员。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值