目录
使用get、 tuple_size、 tuple_element 来访问 tuple 的成员 ( 637P )
bitset 类型 使 位运算符变得更为容易 ( 640P)
使用 default_random_engine 来生成原始随机数 ( 660P)
使用 uniform_int_distribution 分布 和 引起类型 生成 特定范围内的随机数 、随机数生成器(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