C++之标准库特殊设施

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; //默认是二分之一机会
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值