17-标准库设施

标准库特殊设施
  • 随机数
  • 通常CC++使用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,octdec只影响整形运算符对象,浮点值的表示形式不受影响;
        • 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用来表示是否到达文件结尾.
    • 多字节操作
      • getgetline函数都接受相同的参数,他们的行为类似但不相同,两个函数一直读取数据直到:
      • 已经读取到size-1个字符;
      • 遇到了文件结尾;
      • 遇到了分隔符;
      • get将分隔符留作istream中的下一个字符,而getline则读取并丢弃分隔符,无论那个函数都不会将分隔符保存在sink里面;
    • 流随机访问:
      • 各种流类型都支持对流里面数据的随机访问.使用seek来定位到流中给出的指定的位置,可以使用tell来查看我们的当前的位置;
      • 由于istreamostream类型通常部支持随机访问,所以就剩下fstreamsstream;
      • 重定位标记:seek 函数有两个版本,一个表示移动到文件中的绝对地址;另一个移动到一个给定位置的指定偏移量;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值