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