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

目录

定义和初始化 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
    • 0
      点赞
    • 2
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

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

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

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值