C++primer 第十六章笔记 初稿

来源:互联网 发布:aop切面编程 android 编辑:程序博客网 时间:2024/06/05 02:48

17.1 tuple类型

  1. 基本操作

    • 头文件:tuple

    • 一个tuple可以有预定数量的任意多的成员,类似于一个未命名的数据结构

    • 对一个tuple进行定义(初始化),可以显示指明所有类型,也可以调用make_tuple,通过一组给定的初始化值生成

    • 如果想访问其中某个成员,可使用 get(tuple-item)来访问,number必须是 constexpr 整型

    • 如果想比较两个tuple对象,必须满足成员数量相同

  2. tuple_size是一个辅助类模板,通常用来访问某个tuple**类型**的成员的个数,一般形式如下

    auto sz = tuple_size<type-name>::value;

    其中,type-name可由对tuple对象进行decltype操作得到。

  3. tuple_element是一个辅助类模板,通常用来访问一个tuple中某个成员的类型,一般形式如下

    tuple_element<number, type-name>::type x = get<number>(tuple-item);
  4. equal_range模板函数接收两个迭代器,一个值(和一个谓词),返回一个pair指明范围

17.2 bitset

  1. 定义与初始化

    • 定义一个bitset时,必须提供一个常量表达式作为模板参数,表示大小

    • 当使用整型初始化bitset时,整型转化为ULL。如果bitset的大小超过ULL,则补零,否则截断高位

    • 当使用string对象或字符数组初始化bitset时,最小的下标对应最高位,且为01字符串。可以使用迭代器,将子串作为初始值

      string str = "0100011101";bitset<32> bs1(str, 5, 4);          //取第五位开始的四位bitset<32> bs2(str, str.size()-4);  //取最后四位
  2. bitset的操作

    • 包括set/reset/filp等改变值的操作,也包括any/all
      /count/test等检查操作,还有to_ulong等可以转化成无符号长整型操作。

    • IO操作

    • 在流提取过程中,如遇到非01字符,或遇到输入尾部或错误,或达到大小上限,输入才会停止

    • 在流插入过程中,操作对象直接为对象名

17.3 正则表达式

  1. 基本信息

    • 头文件:regex

    • 基本组件

    组件名 作用 regex 表示一个正则表达式 regex_match 匹配字符串与表达式 regex_search 寻找第一个匹配的子序列 regex_replace 用格式替换正则表达式 sregex_iterator regex_search 迭代器 smath 保存搜索结果
  2. 对于regex对象,一般使用正则表达式字符串进行初始化,默认使用语言ECMAScript,也可以用相关操作更改语法。

  3. 用 “\ .” 的表达方式,排除.匹配任意字符的二义性,但为了排除C++对\的二义性,通常用\ \表示需要得到一个\字符

  4. 对于迭代器,每一次递增,即调用一次regex_search

  5. 通过括号可以分割子表达式,并可以通过smath的下标进行访问,当然文本中的括号因此需要添加\ \以表示区分。

  6. 控制匹配格式的字符,定义在std的regex_constants里。

17.4 随机数

  1. C++中随机数生成由两部分完成,引擎负责生成随机数,分部类负责生成具体的分布(包括区间),引擎通过seed()方法改变种子。

  2. 用获取的随机整数除以上界,以获得随机浮点数是一个不好的方法,因为精度的不足,很多浮点数根本不会生成。使用新标准库的uniform_real_distribution是一个好的方法。

17.5 IO

  1. IO中有许多操作符,通常分为两类:一类是控制输出形式;另一类是控制补白和位置;

  2. 一般操作符成对出现,因为操作符一旦使用格式保持,需要在恰当的时候还原格式。

  3. get(),put()等操作属于未格式化的IO,将流以字节序列处理,可以实现回退等操作,但get等操作的返回类型必须是int

  4. 通过tellg(tellp)/seekg(seekp)操作,可以获取流的地址,进行定位操作。