C++ 学习笔记(17)tuple类型、bitset类型、随机数(引擎和分布)、IO库(操纵符、未格式化输入输出、随机访问)
参考书籍:《C++ Primer 5th》
17.1 tuple 类型
17.1.1 定义和初始化tuple
- tuple 的构造函数是explicit的。
tuple <int, float , string> t = {1, 2.0, "stf"}; // 错误。要使用显式构造
tuple <int, float , string> t{1, 2.0, "stf"}; // 正确。
auto t1 = make_tuple(123, 6.6, "bbb"); // tuple<int, double, const char *>
get<0>(t1); // 获取第一个对象的引用(int &):123
size_t sz = tuple_size<decltype(t1)>::value; // t1的成员数量:3
tuple_element<1, decltype(t1)>::type d = get<1>(t1); // t1第二个成员类型:double
17.2 bitset 类型
- 值为unsigned long long 类型。
bitset<8> bitvec1(~1); // 除了第一位为0,其他7为1,即:1111 1110
bitset<4> bitvec2("01011111"); // 使用字符串直接初始化,因为只有4位,实际为:0101
bitvec1 |= 1UL; // 将第一位置1
bitvec1 &= ~(1UL << 3); // 将第四位置0
17.3 正则表达式
略。
17.4 随机数
- 随机数引擎类:生成随机unsigned序列。
- 随机数分布类:使用引擎返回服从特定概率分布的随机数。
- 随机数发生器:指分布对象和引擎对象的组合。
- 随机数引擎和分布都是函数对象类。
- C++程序不应该使用库函数rand,而应该使用
default_random_engine
类和恰当的分布类对象。
17.4.1 随机数引擎和分布
- 相同种子的引擎,产生相同的随机数。(对于局部随机发生器,可以设置为static以保证每次调用都不同)
default_random_engine e; // 默认随机数引擎
for (size_t i = 0; i < 10; i++)
cout << e() << " "; // 随机数,范围在[0,unsiged最大值]
cout << endl;
uniform_int_distribution<unsigned> u(0, 9); // 均匀分布,随机整数,范围在[0, 9]
for (size_t i = 0; i < 10; i++)
cout << u(e) << " "; // 均匀分布在[0, 9]的随机数
17.4.2 其他随机数分布
- uniform_real_distribution:随机double类型数,范围在[a, b)。
- normal_distribution:正态分布。构造函数第一个参数为均值,第二个参数为标准差。
- binomial_distribution:二项分布。常返回值作为bool,用来求概率值。
17.5 IO库再探
17.5.1 格式化输入与输出
- iostream的操纵符:
-
cout.precision:设置精度时,浮点数会安精度舍入,即3.14159在精度为四位时,值为3.142,精度为三位时,值为3.14。
-
定义在iomanip头文件的操纵符:
17.5.2 未格式化的输入输出操作
-
peek:返回输入流中下一个字符的副本,但不会从留在删除,返回的值还在流中。
-
unget:输入流往后移,最后读取值重新回到流中。
-
putback:同unget,但接受的参数必须与最后读取的值相同。
-
输入操作返回值为int,因为可以用来判断是否到文件末端(宏:EOF)。
- get()将分隔符留作istream中下一个字符,getline()则读取并丢弃分隔符。
17.5.3 流随机访问
- 随机IO本质依赖于系统。
- seek 和 tell 函数分别代表“放置”和“获得”,两者操作同一个标记。