C++Primer 第五版——《第十七章》“ 标准库特殊设施 ” 选读

本文介绍了C++ Primer第五版中第十七章关于标准库的特殊设施,涵盖tuple的定义、初始化及访问成员,tuple的关系和相等运算,equal_range算法,bitset的使用,正则表达式库,以及随机数生成的相关内容。重点讲解了如何通过get、tuple_size、tuple_element访问tuple成员,以及如何使用default_random_engine和uniform_int_distribution生成特定范围内的随机数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

定义和初始化 tuple 类型

使用get、 tuple_size、 tuple_element  来访问 tuple 的成员 ( 637P )

tuple 类型的 关系和相等运算符

equal_range 算法(639P)

 bitset 类型 使 位运算符变得更为容易 ( 640P)

定义和初始化为 bitset( 641P)

c++ 正则表达式库(RE库)(645P)

使用 default_random_engine 来生成原始随机数 ( 660P)

使用 uniform_int_distribution 分布 和 引起类型 生成 特定范围内的随机数 、随机数生成器(661P)

比较随机数引擎 和 rand 函数 (661P)

函数中定义的随机数引擎对象 和 分布对象都应将其定义为 static, 否则每次调用函数都将生成相同的序列 (662P)

使用 随机数种子 来生成不同结果的随机数 、time 函数(662P)



定义和初始化 tuple 类型


  • 当我们想要将一些数据组合成一个对象,但又不想麻烦地定义一个数据结构来表示这些数据时,tuple 是最有用的。
  • tuple 类型 以及其所定义的函数操作都定义在 tuple 头文件中。
int main()
{
	std::tuple<size_t, size_t, size_t> threeD; // 使用的是 tuple 的默认构造函数,都值初始化为 0
	std::tuple<size_t, size_t, size_t> threeA = { 1,2,3 }; // 编译器上运行正确,说明 tuple 的构造函数 不是 explicit 的
	std::tuple<size_t, size_t, size_t> threeB{ 2,3,5 }; // 正确
	std::tuple<string, vector<double>, int, list<int>> someVal("constants", { 3.14,2.178 }, 42, { 55,66,77,88 });

     tuple<size_t, size_t> origin(0, 0);

	// 使用 auto 配合 make_tuple 操作,可以让编译器从初始值的类型来推断出 tuple 的类型,该类型为 tuple<const char*,int ,double >
	auto item = make_tuple("huang", 3, 20.00); // 使用 make_tuple 函数显式生成一个 tuple 对象
	system("pause");
	return 0;
}

使用get、 tuple_size、 tuple_element  来访问 tuple 的成员 ( 637P )


  • 一个 tuple 类型的元素数目是没有限制的,因此tuple 的元素都是未命名的。
  • 要想访问 一个 tuple 对象中的元素, 可以使用 get 函数模板。 为了 使用 get ,我们必须显式传递 模板实参,表示要访问的元素的位置。
  • 我们还要传递一个 tuple 对象 给 get , 它返回对指定成员的引用。
int main()
{
	// 使用 auto 配合 make_tuple 操作,可以让编译器从初始值的类型来推断出 tuple 的类型,该类型为 tuple<const char*,int ,double >
	auto item = make_tuple("huang", 3, 20.00); // 使用 make_tuple 函数显式生成一个 tuple 对象

	auto book = std::get<0>(item);
	cout << "输出 item 中第一个元素值:" << book << endl;

	auto cnt = std::get<1>(item);
	cout << "输出 item 中第二个元素值:" << cnt << endl;

	auto price = get<2>(item) / cnt; // 将返回的值 / cnt
	cout << "输出 item 中 price的值:" << price << endl;

	std::get<2>(item) *= 0.8; // 给item 最后一个元素的值 * 0.8
	cout << "std::get<2>(item) *= 0.8 后的值为:" << (std::get<2>(item)) << endl;
	system("pause");
	return 0;
}

输出结果为:

输出 item 中第一个元素值:huang
输出 item 中第二个元素值:3
输出 item 中 price的值:6.66667
std::get<2>(item) *= 0.8 后的值为:16
  • 尖括号中 的值必须是一个整型表达式。 
  • 尖括号中的值必须是 大于等于0 ,并且不大于 tuple 类型中的元素个数。
  • 使用  tuple_size<tupleType>::value 可以获取到 tuple 对象的元素数量
  • 使用 tuple_element 可以 获取到 tuple 对象的 中某个元素的类型。
  • 但是使用上述两个 类模板之前需要知道 tuple 对象的类型。我们可以通过 使用 decltype 来确定一个 tuple 对象的实际类型是什么
int main()
{
	
	// 使用 auto 配合 make_tuple 操作,可以让编译器从初始值的类型来推断出 tuple 的类型,该类型为 tuple<const char*,int ,double >
	auto item = make_tuple("huang", 3, 20.00); // 使用 make_tuple 函数显式生成一个 tuple 对象

	typedef decltype(item) trans; // trans 的类型是 item 的 类型 

	// 返回 trans 类型对象中元素的数量
	std::size_t sz = std::tuple_size<trans>::value; 
	cout << " item 中元素的元素为:" << sz << endl;

	std::tuple_element<0, trans>::type  cnt = get<0>(item); // cnt 是 string 
	
	system("pause");
	return 0;
}

输出结果为:

 item 中元素的元素为:3
  • tuple_size 类模板中有一个&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值