这几天主要是学习了第十六章标准库特殊设施,有些在短期内可能很难用到如正则表达式,底层IO操作等等。
17.1
tuple类型
tuple是类似pair的模板。可以把tuple看做一个“快速而随意”的数据结构。
tuple<size_t, size_t, size_t> threeD;
auto item = make_tuple("3223", 3, 43.0);
//item是tuple
使用get来访问tuple成员
auto bool=get<0>(item);//返回item的0元素
tuple_size<tupleType>::value//指某个tuple类型中的元素个数
tuple具有关系和相等运算符,只有两个tuple的成员数目和成员类型均相同时才可比较,按字典序比较。
tuple的一个常见用途是从一个函数返回多个值。通过返回一个tuple再get<i>就可以找到想用的值。
17.2
bitset类型
标准库定义了bitset类,bitset是一个二进制序列。
bitset<32> bitvec(10U);//前十位为1,高位为0
可以直接从一个unsigned初始化bitset
bitset<13> bitvec1(0xffef);//1111111101111
高位被舍弃
可以从一个string初始化一个bitset
bitset<32> bitvec2("1100");//这个string中只能有01如有其它数据则报错,3 4两位为1,其余均为0
要注意string的下标序号习惯和bitset恰好相反;string中下标最大的字符(最右字符)用来初始化bitset中的低位。
可以指定string的一部分来初始化bitset形式为bitset<num> b(str,pos,rightshift);如果未加rightshift则一直到string结束。
string str("1110100101001");
bitset<32> bitvec(str,5,4);从str[5]开始的后面4个字符
bitset<32> bitvec2(str,str.size()-4);str结束前的四个字符
bitset的几个关键操作
.set(pos);置位,也可以set(pos,0/1);指定pos的值
.reset(pos);复位
.flip(pos);翻转
.test(pos);检测
b[pos]返回pos处的布尔值
b.any();
b.all();
b.none();分别是有、全、无置位的么,返回布尔值
b.count();有几个置位的
b.to_ulong();
b.to_ullong();
b.to_string();分别转化为三种类型
os<<b;
is>>b;输入输出b
bitset<32> b;
cin>>b;
cout<<b<<endl;
注意如果bitset中的值不能放入指定类型中,则这两个操作会抛出一个overflow_error异常。
17.3
正则表达式
这节由于涉及到大量c++之外的知识,所以为深究。大概描述是正则表达式是一种字符串的标准格式,用regex表示。regex(string,mode);mode可不加默认EMCAscript
smatch,cmatch 类型表示string 和const char *的与regex的匹配。regex_search(string,smatch,regex)
将匹配到的结果放到smatch中,使用smatch.str();就可输出相应的string