tuple
tuple基本操作
typedef decltype (item) trans; // trans 是item的类型.
//返回trans类型对象中成员的数量
size_ t sz = tuple_ size<trans>: :value; //返回3
// cnt的类型与item中第二个成员相同
tuple_ element<1, trans>::type cnt = get<1>(item); // cnt 是一个int
使用tuple返回多个值
bitset类型
#include <bitset>
定义和初始化bitset
bitset<32> bitvec(10); //32位;
bitset的操作
正则表达式
介绍如何使用C++正则表达式(RE库),它是新标准库的一部分。RE库定义在头文件regex中,它包含多个组件:
使用正则表达式库
//查找不在字符c之后的字符串ei
string pattern("[^c]ei") ;
//我们需要包含pattern的整个单词
pattern = "[[:alpha:]]*" + pattern + "[[:alpha:]]*";
regex r (pattern); // 构造一个用于查找模式的regex
smatch results ; //定义一个对象保存搜索结果
//定义一个string保存与模式匹配和不匹配的文本
string test_ str = "receipt freind theif receive";
//用r在test_ str中查找与pattern匹配的子串
if (regex_ search(test_ str, results, r)) // 如果有匹配子串
cout << results.str() << endl; //打印匹配的单词
regex:
正则表达式错误类型:
随机数
rand函数有一些问题:即使不是大多数,也有很多程序需要不同范围的随机数。一些应用需要随机浮点数。一些程序需要非均匀分布的数
定义在头文件random中的随机数库通过一组协作的类来解决这些问题:随机数引擎类和随机数分布类。
C+程序不应该使用库函数rand,而应使用default_random_engine类和恰当的分布类对象
随机数引擎和分布
default_random_engine e;
for(size_t i = 0;i<10;++i)
cout<<e()<<" ";
为了得到在一个指定范围内的数,我们使用一个分布类型的对象:
//生成0到9之间(包含)均匀分布的随机数
uniform int_ distribution<unsigned> u(0,9) ;
default_ random_ engine e; // 生成无符号随机整数
for(size__t i = 0;i < 10;++i)
//将u作为随机数源
//每个调用返回在指定范围内并服从均匀分布的值
cout << u(e) << ”";
我们会发现,这样每次调用的数是一样的,所以我们应该将引擎和关联的分布对象定义为static,这样就能记住上次的状态,下次生成不同的随机数
即一个给定的随机数发生器一直会生成相同的随机数序列。一个函数如果定义了局部的随机数发生器,应该将其(包括引擎和分布对象)定义为static的。否则,每次调用函数都会生成相同的序列。
//返回一个vector, 包含100个均匀分布的随机数
vector<unsigned> good_ randVec ()
{
//由于我们希望引擎和分布对象保持状态,因此应该将它们
//定义为static的,从而每次调用都生成新的数
static default_ random_ engine e;
static uniform_ int_ distribution<unsigned> u(0,9);
vector<unsigned> ret;
for(size_ti=0;i<100;++i)
ret.push_ back(u(e)) ;
return ret;
}
设置随机数发生器种子
随机数发生器会生成相同的随机数序列这一特性在调试中很有用。 但是,一旦我们的程序调试完毕,我们通常希望每次运行程序都会生成不同的随机结果,可以通过提供一个种子(seed) 来达到这一目的。种子就是一一个数值,引擎可以利用它从序列中一个新位置重新开始生成随机数。
default_ random_ engine el; //使用默认种子
default random engine e2 (2147483646) ; //使用给定的种子值
// e3和e4将生成相同的序列,因为它们使用了相同的种子
default_ random_ engine e3; //使用默认种子值
e3.seed (32767) ; //调用seed设置一个新种子值
default_ random_ engine e4 (32767) ; //将种子值设置为32767
for(size_ti=0;i!=100;++i){
if(e1()==e2())
cout << "unseeded match at iteration: ”<< i << endl;
if (e3() != e4() )
cout << "seeded differs at iteration: ”<< i << endl;
}
选择一个好的种子,与生成好的随机数所涉及的其他大多数事情相同,是极其困难的。可能最常用的方法是调用系统函数time.这个函数定义在头文件ctime中,它返回从一个特定时刻到当前经过了多少秒。函数time接受单个指针参数,它指向用于写入时间的数据结构。如果此指针为空,则函数简单地返回时间:
default_random engine el (time(0)); // 稍微随机些的种子
其他随机数分布
随机数引擎生成unsigned数,范围内的每个数被生成的概率都是相同的。而应用程序常常需要不同类型或不同分布的随机数。标准库通过定义不同随机数分布对象来满足这两方面的要求,分布对象和引擎对象协同工作,生成要求的结果。
随机生成实数
default_ random_ engine e; // 生成无符号随机整数
// 0到1 (包含)的均匀分布
uniform real_ distribution<double> u(0,1) ;
for(size_ti=0;i<10;++i)
cout << u(e) << ”";
生成非均匀分布的随机数
default_random_engine e;
//生成随机整数
normal_distribution<> n(4,1.5) ;
//均值4,标准差1.5
生成bool值的随机数
bernoulli_distribution,因为它是一个普通类,而非模板。此分布总是返回一个bool值。它返回true的概率是一个常数,此概率的默认值是0.5。
default_random_engine e;
bernoulli_distribution b; //默认是二分之一机会