标准库特殊设施
- 随机数
- 通常
C
和C++
使用rand
函数来生成随机数,通常范围值在0-->32767(系统最大数)
之间;新标准可以使用定义在random
标准库里面的随机数引擎和随机数分
布类来解决问题;使用随机数引擎生成随机unsigned
整数序列;然后使用随机数分布类,使用引擎返回服从特定概率分布的随机数;
- 随机数引擎生成的随机数通常不是合理范围内的随机数,称为原始随机数;需要使用分布类型引擎进行转换;
- 随机数发生器,是指随机数发生器和引擎对象;
- 分布类型是函数对象类,分布类型定义了一个调用运算符,接受一个随机数引擎作为参数,分布对象使用它的引擎参数生成随机数,并映射到指定的分布;
- 引擎的范围可以通过
e.min()
和e.max()
来决定; - 对于一个给定的随机数,每次运行它都会返回相同的数值序列.
- 一个随机数发生器一直会生成相同的随机数序列.一个函数如果定义了局部的随机数发生器,应该将随机数引擎和分布对象定义为
static
,否则每次调用函数都
会生成相同的序列; - 随机数设置种子:在创建引擎对象时提供种子,或者调用引擎的
seed
成员; - 如果程序作为一个自动过程的一部分反复运行,将
time
的返回值作为种子的方式就无效了,因为可能多次使用的都是相同的种子. - 随机数的随机分布:
- 使用随机数生成的每个书的概率时相同的,但是有时候需要生成不同类型或者不同分布的随机数;标准库定义不同随机数分布对象来满足要求;
- 使用这种:
default_random_int_engine e;
uniform_real_distribution<double> u(1,0);
for(size_t i=0;i<10;++i)
cout << u(e) << endl; - 分布类型都是模板,具有单一的模板参数,并且每个分布模板都有一个默认的模板参数,生成浮点的类型默认是
double
类型,生成整型的类型默认是int
uniform_real_distribution<> u(0,1);
- 生成非随机分布的随机数包含有
20
中类型;
IO库
- 三种特殊的
IO
库特性:格式控制,未格式化IO
和随机访问. - 标准库定义了一族操纵符来改变流的格式状态,一个操纵符表示的是一个函数或者是一个对象,能够影响流的状态并能够用作输入或者输出运算符的状态;
-
endl
:表示的含义是输出一个换行符,并且刷新缓冲区; - 操纵符包括两大类:用于控制数值的输出形式以及控制补白的数量和位置,大多数改变格式的状态的操作符都是设置/复原成对出现的;
- 当操作符改变流的状态时,通常改变后的状态对所有的后续
IO
都有效; -
boolapha
:用来设置生成bool
值的输出格式; - 操作符
hex
,oct
和dec
只影响整形运算符对象,浮点值的表示形式不受影响; showbase
:用于显示数值的进制,使用noshoebase
来取消;- 使用
uppercase
:用来设置a-f
按照大写格式输出;
- 控制浮点数精度的几种方式:
- 使用多高精度来打印浮点值;
- 数值是打印为十六进制,定点十进制还是科学技术法形式
- 对于没有小数部分的浮点值是否打印小数点;
- 接收参数的操纵符都定义在头文件
<iomanip>
里面; - 除非需要控制浮点数的表示形式,否则标准库将选择计数法的最合适的形式;
-
scientific
:用来表示使用科学技术法的形式打印数据; -
hexfloat
:强制浮点数使用十六进制; -
defaultfloat
:用于恢复设置, -
showpoint
:用于打印小数点,同时可以取消打印小数点noshowpoint
; -
setw
:用于指定下一个数字或者字符串的最小空间; -
left
:表示输出左对齐; -
right
:表示输出右对齐; -
internal
:用于控制负号的位置,表示左对齐符号,右对齐值,使用空格填满所有空间; -
setfill
:允许指定一个字符代替默认的空格来填补白输出;
- 输入控制运算符
noskips
:表示在遇到空白字符时,不跳过空白字符;
- 标准库支持未格式化的输入输出操作:
get
,put
等操作; - 将字节放回输入流的操作:
- 1.
peek
返回输入流里面中下一个字符的副本,但是他不会从流删除,peek
的返回值仍然在流里面; - 2.
uget
是的输入流小后移动,从而最后读取的值取回到流中,即使我们不知道最后从流里面读取什么值,仍然可以使用unget
; - 3.
putback
是特殊办事本的unget
,退回从流里面读取的最多一个值.标准库不保证在中间不进行读取操作的情况下能连续调用putback
或者unget
;
- 函数
peek
和无参的get
版本返回值是int
类型从输入流返回一个字符.返回值是int
的原因是可以返回文件的结尾;这个过程是:返回值是int
的函数首先将字符转换为unsigned char
,然后进行整形提升为int
,这些值都是负值,标准库使用负值表示文件结尾;使用EOF
用来表示是否到达文件结尾. - 多字节操作
-
get
和getline
函数都接受相同的参数,他们的行为类似但不相同,两个函数一直读取数据直到: - 已经读取到
size-1
个字符; - 遇到了文件结尾;
- 遇到了分隔符;
-
get
将分隔符留作istream
中的下一个字符,而getline
则读取并丢弃分隔符,无论那个函数都不会将分隔符保存在sink
里面;
- 流随机访问:
- 各种流类型都支持对流里面数据的随机访问.使用
seek
来定位到流中给出的指定的位置,可以使用tell
来查看我们的当前的位置; - 由于
istream
和ostream
类型通常部支持随机访问,所以就剩下fstream
和sstream
; - 重定位标记:
seek
函数有两个版本,一个表示移动到文件中的绝对地址
;另一个移动到一个给定位置的指定偏移量;