#include
tuple ≈ pair (plus)
pair只有两个成员,可以是不同的类型,而tuple可以有任意多个成员,并且类型可以各不相同.
在懒得重新定义自定义类型但又需要一个可以装下多个不同类型的容器的时候(例如一个函数需要返回多个不同类型数据的时候),我们可以使用tuple.
定义tuple需要指出每个成员的类型:
tuplet;
初始化就在名字后加上参数列表:
tuplet(1, 'a', "hello");
也可以使用上表中的make_tuple来生成tuple对象:
auto t = make_tuple(1, 'a', "hello");
访问tuple的成员不能使用迭代的方法,只能通过get来获取指定下标的成员,并且给定的索引不能是变量,只能是在编写程序时就写上的数字:
通过get不仅能获取tuple的成员,还可以修改指定下标的成员:
若是tuple的成员数量相同且各个对应下标的成员都可以进行比较的话,可以直接将两个tuple使用运算符进行比较.并且由于可以进行比较,tuple可以用于无序容器(set,map……)的关键字类型.
书中以一个返回值类型为tuple的函数为例介绍了一小节,这里不多介绍,大家可以自己去敲敲代码熟悉熟悉tuple的操作,相关内容不难.
#include
bitset专门用于处理二进制位集合.
可以结合上表参考下例
bitset<4> b: // 0000
bitset<4> b("1010"); // 1010
bitset<4> b(0xff); // 1111
bitset<4> b("111000",1,4); // 1100
如何操作bitset,结合下表,在需要用的时候查阅即可.
#include
正则表达式是一种描述字符序列的方法,即可以编写正则表达式来匹配字符串,常用于(对我而言)前端检验用户是否合法输入例如电话,邮箱,身份证之类的信息以及爬虫来提取信息.
正则表达式具体的编写规则不介绍,可以自行搜索学习,正则表达式是很实用的东西,无论是哪种编程语言基本都有对应的库提供api.
下面我会放出书中列出的C++正则表达式库提供的各个api,大家在学习了正则表达式的编写后自己尝试着练练手,我就不再示范了.
regex为描述正则表达式的类,即应当给类型为regex的对象赋值正则表达式,然后对该对象使用regex_match,regex_search等方法.
一个正则表达式的语法是否正确是在运行时(而不是编译时)解析的,因此我们应当避免创建不必要的正则表达式,一次来减少耗时开销.
#include
C++随机数库有引擎(random-number engines)和分布(random-number distribution)组成.
随机数引擎是函数对象类,使用默认随机数引擎对象,调用运算符返回一个随机的unsigned整数
default_random_engine e; //默认的随机数引擎生成无符号整型
unsigned int num=e();
不同随机数引擎的性能和随机质量不同.
使用分布类型的对象配合引擎,可以生成指定范围的随机数,例如书中例子:
一般的随机数发生器是指分布对象和引擎对象的组合.
我们生成的随机数是固定的,每次启动程序得到的随机数都是一样的.我们可以设置随机数发生器种子,通常我们会使用时间戳来设置为种子.
//default_random_engine e(随机数种子);
#include
default_random_engine e(time(0));
主要是依靠分布来控制随机数分布而不是引擎.
生成随机实数:
uniform_real_distribution u(0,1) //类型为double的,范围为0~1的随机分布
default_random_engine e;
double n=u(e); //得到0~1的double浮点数.
生成正态分布:
normal_distribution<> n(均值,标准差) //正态分布
我们需要注意的是,随机数引擎返回的是固定的随机数序列,所以若要编写相关的函数,记得将函数内引擎的定义设为静态的,并且避免在循环内定义.
标准库定义了一组操纵符来修改流的格式状态,例如endl.通常使用操纵符改变流的状态对后续IO都会生效.
布尔值格式操纵符:boolalpha
我们正常打印布尔值会打印出1(true)或0(false),而使用了boolalpha之后,则会打印出true和false.
整型进制操纵符:hex(十六进制),oct(八进制),dec(十进制)
以上仅对整型生效,浮点数不受影响.
在原本的输出数值前面加上前导0x(十六进制)或是0(八进制),可以以十进制的方式输出十六进制或者八进制.
控制浮点数格式操纵符:setprecision(打印精度)showpoint(打印小数点)……
需要传入参数的操纵符都定义在头文件iomanip中.
#include
之前的IO操作都是格式化IO,使用未格式化IO可以将流当作一个无解释的字节序列来处理.
可以使用get和put来读取和写入一个字符.
不推荐使用底层函数!
不推荐使用底层函数!
不推荐使用底层函数!
istream和ostream类型通常不支持随机访问,因此随机访问仅适用于fstream和sstream.
随机IO的本质是依赖于系统的,因此想要理解则需要查阅系统文档.