c++ primer 第十七章标准库特殊设施

17.1 tuple类型

tuple可以有任意数量的成员,每个成员都有对应的类型。

17.1.1 定义和初始化tuple

定义时需要指定每个成员的类型。

构造函数是explicit的,需要直接初始化。

make_tuple可以自动推断成员类型。

使用get<1>(item)访问tuple中的成员。

17.2 bitset 类型

bitset类是一个二进制位集合的类。

17.2.1 定义和初始化bitset

定义时需要指定bitset的长度。可以从一个unsigned整型或者字符串进行初始化得到。

17.3 正则表达式

regex头文件中包含了C++正则表达式相关的库。

17.3.1 使用正则表达式库

regex_search 搜索字符串中第一个匹配的字符串。

regex_error在运行时跑出正则表达式的错误。

正则表达式是在运行中编译的,因此很慢。避免创建不必要的正则表达式。

对应不同的字符串和字符数组有不同的匹配结果类型。

17.3.2 匹配与Regex迭代器类型

使用regex_iterator可以得到所有匹配的字符串的迭代器。使用递增运算可以推进其调用regex_search的结果。

可以得到匹配的前面和后面的部分。

17.3.3 使用子表达式

模式中括号包起来的部分叫做子表达式,可以在结果中只使用子表达式的匹配结果。

在match结果中直接使用下标表达式调用对应的子表达式匹配的部分。

17.3.4 使用regex_replace

可以使用regex_replace将匹配表达式的字符串更换成另外的格式。

新的格式中需要调用子表达式时使用$2的形式,在std:regex_constants中。

17.4 随机数

C++ 新标准中使用random头文件中的随机数引擎与随机数分布类的配合来完成随机数生成的工作。

17.4.1 随机数引擎和分布

default_random_engine e;表示生成一个随机数引擎。随机数引擎是一个函数调用类,可以调用e()返回一个随机无符号整数。

随机数引擎可以设置种子返回最大范围最小范围等操作。

使用一个分布类型的对象来得到一个指定范围的分布对象。分布类型也是函数对象类,调用时接受一个随机数引擎做参数。

int randomInt(unsigned int s,unsigned beg, unsigned end) {
	default_random_engine e(s);
	uniform_int_distribution<unsigned> u(beg,end);
	u(e); //此处不先调用一次的话返回值都是一样的,不知为何
	return u(e);
}

分布类型与随机数引擎的合作如代码所示。

为了避免随机数引擎返回相同的结果,可以选择设定其对象为静态类型或者是传入不同的随机数种子。

17.4.2 其它随机数分布

可以生成一些其他分布类型,比如0到1的随机double类型或者伯努利分布等等。

17.5 IO库再探

17.5.1 格式化输入和输出

标准库定义了一组操纵符来修改流的格式状态,并且可以作为运算符的运算对象。比如endl。

很多操纵符改变格式的状态。比如boolalpha控制布尔值的输出格式,整数输出的进制控制等等。

对浮点数指定输出格式。精度,进制和小数点等等。还可以添加空白或其它字符,选择输入不跳过空白符号等等。

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

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

可以读取单个字节,将一个字符放回流等等操作。

也可以get或getline等进行多个字节数据的操作。

17.5.3 流随机访问

seek和tell函数可以设定在输入输出流中定位的位置。

通过tell和seek设定和读取当前的位置,可以实现对流的随机访问。但需要注意的是一个流中只有一个位置标记,因此如果需要改变当前读或写的位置就要重新设定位置。

猜你喜欢

转载自blog.csdn.net/qq_25037903/article/details/83417983