第十七章 标准库特殊设施

tuple类型
tuple类型类似pair类型,不过pair类型只保存两个成员,但tuple类型没有此限制 ,tuple类型及其伴随类型和函数都定义在tuple头文件中

定义:

tuple<int,string,double> t;     //使用默认构造函数初始化
tuple<int,string,double> s(42,“hello”,1.5)
                                //构造函数初始化,因为构造函数是explicit的,所以只能直接初始化

NOTE:我们可以将tuple类型看作一种"快速且随意"的数据结构

访问:auto i=get<0>(t)//访问t的第1个成员 get函数返回t的指定成员的引用,若t是左值,则返回左值引用,否则是右值引用

typedef decltype(t) trans //trans是t的类型
size_t sz=tuple_size<trans>::value //返回trans类型中成员的数量
tuple_element<1,trans>::type cnt   //cnt是string,返回trans类型中第2个成员的类型

tuple类型也支持关系运算符和相等运算符,不过tuple类中的每个成员都要支持相应的操作

随机数
定义在头文件random中

  • 随机数引擎类:生成unsigned随机数序列
  • 随机数分布类:使用引擎类生成一个指定类型、给定范围、服从特定分布概率的随机数

note:c++程序不应该使用库函数rand,而应该使用default_random_engine类和恰当的分布类对象

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

随机数分布类

uniform_int_distribution<unsigined> u(0,9)   //生成0-9,平均分布
uniform_real_distribution<double> u(0-1)     //生成0-1的随机浮点数,平均分布
normal_distribution<double> u(4,1.5)         //正态分布,均值4,标准差1.5

note:当我们说随机数发生器时说的是分布类对象和引擎类对象的组合

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

我们通过提供一个种子(seed)的方式来使程序每次运行时都生成不同的随机数,最常用的方法是调用系统函数time,这个函数在头文件ctime中,它返回一个特定时间到现在经过了多少秒

bernoulli_distribution:

bernoulli_distribution b(e)
  • 是一个普通类而非模板
  • 此分布返回一个bool值,默认情况下true的概率为0.5
  • 也可以调整概率bernoulli_distribution b(.55)

正则表达式
正则表达式是一种描述字符序列的方法,C++11中添加了正则表达式库(RE库)定义在头文件regex中,包含多个组件

regex               表示一个正则表达式类
regex_match         将一个字符序列与一个正则表达式匹配
regex_search        寻找第一个与正则表达式匹配的子序列
regex_replace       用给定格式替换一个正则表达式
sregex_iterator     迭代器适配器,用来遍历string中所有匹配的子串
smatch              容器类,保存string中的搜索结果
ssub_match          string中匹配的子表达式的结果(正则表达式的子表达式对象为该类型)

regex的操作

regex r(re,f)       用正则表达式re初始化,f为如何处理对象的表示,默认为ECMAScript
r=(re2)              赋值
r.assign(re2)        与(=)效果相同
r.mark_count()       返回r中子表达式的数目
r.flags()            返回r中的标志集

regex_match和regex_search

  • 如果整个输入序列都与表达式匹配,那么regex_match返回true
  • 如果输入序列中有子串与表达式匹配,那么regex_search返回true

参数

(seq,r,mft)  seq表示输入范围,r是正则表达式,mft是匹配标志,会影响匹配过程
(seq,m,r,mft)  m是smatch对象,如果匹配成功,那么结果保存在smatch中

note:正则表达式是由另外一种语言编写的程序,因此不由C++编译器解释,一个正则表达式有错误是在运行时才解析的

错误时会抛出一个regex_error的异常

	catch (regex_error e)
	{
		cout << e.what()     what()描述发生了什么错误
			<< e.code() ;   code()返回某个错误对应的类型编码
	}

正则表达式类和输入序列类型

输入序列类型:string            regex、smatch、ssub_match、sregex_iterator
             const char*       regex、cmatch、csub_match、cregex_iterator
             wstring           wregex、wmatch、wssub_match、wsregex_iterator
             const wchar_t*    wregex、wcmatch、wcsub_match、wcregex_iterator   

regex迭代器类型

sregex_iterator(beg,end,r)
遍历beg到end所表示的string,调用sregex_search(beg,end,r)定位到输入中第一个匹配的位置

smatch操作

m.ready()     如果已经通过regex_search或regex_match设置了m,那么返回true
m.size()      如果匹配失败,则返回0,否则返回最近一次匹配的正则表达式中子表达式的数目
m.empty()     若m.size()返回为0,则返回true
m.prefix()    一个ssub_match对象,表示当前匹配之前的序列
m.suffix()    一个ssub_match对象,表示当前匹配之后的序列
m.format(dest,fmt,mft) 向dest指向的容器中写入使用格式字符串fmt生成的格式化输出,
                           mft表示标志位,默认为format_default
m.format(fmt,mft)返回string,保存输出
m.length(n)   表示第n个匹配的子表达式的大小
m.position(n) 表示第n个子表达式距序列开始的位置
m.str(n)      第n个子表达式匹配的string
m[n]           表示第n个子表达式的ssub_match对象
m.begin(),m.end() 表示m中sub_match返回的迭代器

ECMAScript正则表达式语言的一些特性

  • \{d}表示单个数字{d}{n}表示一个n个数字的序列
  • 在方括号中的字符集合表示匹配这些字符中的任意一个([-. ]表示匹配-或.或 ,.在括号中没有特殊含义)字符.表示匹配任意字符
  • 后接?表示可选的
  • 当特殊字符没有特殊含义时要用\\去掉特殊含义

正则表达式中通常包含一个或多个子表达式,每当我们用括号分组每个可行选项时,也就声明了这些选项生成的子表达式

string phone("(\\()?(\\d{3})(\\))?([-. ])?(\\d{3})([-. ]?)(\\d{4})");
regex r(phone);
算上整个表达式共有8个子表达式,r.str(0)表示的是整个表达式

子匹配操作(ssub_match)

matched        如果该表达式匹配了,那么返回true
first,second  指向匹配序列首元素和尾后的迭代器,如果未匹配,那么first=second
length()     匹配的大小,如果matched为false,则为0
str()        返回包含输入中匹配的string,若matched为false,则返回空string
s=ssub         将ssub_match对象ssub转化为string

regex_replace
正则表达式不仅用在希望我们查找一个序列的时候,还可以通过regex_replace函数用来替换查找到的序列,它接受一个输入的字符序列和一个regex对象,还接受一个描述我们想要的输出形式的字符串

string fmt(“$2.$5.$7”)   $后跟子表达式的索引表示特定格式的表达式   DDD.DDD.DDD
regex_replace(dest,seq,r,fmt,mft) dest为写入位置,seq为输入范围,r为正则表达式,
regex_replace(seq,r,fmt,mft)   mft为标志位,表示处理的方式,默认为match_default

bitset
定义在头文件biset中。
用unsigned值初始化bitset

bitset<13> bitvec(0xbeef)   1111011101111
bitset<20> bitvec(0xbeef)   00001011111011101111

从string中初始化bitset

bitset<32> bitvec("1100")  1100
string str("1111111000000011001101")
bitset<32> bitvec(str,5,4)  从str[5]开始4个二进制数 1100
bitset<32> bitvec(str,str.size()-4)  最后的四个字节

bitset操作

b.any()       b中是否存在置位
b.all()       b中所有都置位了吗
b.none()      b中不存在置位吗
b.count()     b中置位的个数
b.size()      返回b中的位数
b.test(pose)  检查pos的位置是否置位
b.set(pos,v) 将pos出设置为bool值v
b.set()       全部置位
b.rest(pos)   将pos位复位
b.reset()
b[pos]          返回pos处的值
b.to_ulong()  返回一个unsigned long或unsigned long long的值,其位模式与b相同
b.to_ullong()
b.to_string()  返回一个string,表示b的位模式
os<<b
is>>b

猜你喜欢

转载自blog.csdn.net/lancelot0902/article/details/90180863