c++11 std:pair 和std::tuple元组的使用
发布日期:2021-06-28 22:10:31
浏览次数:2
分类:技术文章
本文共 2983 字,大约阅读时间需要 9 分钟。
std::pair固定包含两个数据,Defined in header <utility>场景pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。 pair的实现是一个结构体,主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量。make_pair函数template pair make_pair(T1 a, T2 b) { return pair(a, b); }很明显,我们可以使用pair的构造函数也可以使用make_pair来生成我们需要的pair。 一般make_pair都使用在需要pair做参数的位置,可以直接调用make_pair生成pair对象很方便,代码也很清晰。 另一个使用的方面就是pair可以接受隐式的类型转换,这样可以获得更高的灵活度。灵活度也带来了一些问题如:std::pair<int, float>(1, 1.1);std::make_pair(1, 1.1);是不同的,第一个就是float,而第2个会自己匹配成double。类模板:template <class T1, class T2> struct pair参数:T1是第一个值的数据类型,T2是第二个值的数据类型。功能:pair将一对值组合成一个值,这一对值可以具有不同的数据类型(T1和T2),两个值可以分别用pair的两个公有函数first和second访问。具体用法: 定义(构造): pair<int, double> p1; //使用默认构造函数 pair<int, double> p2(1, 2.4); //用给定值初始化 pair<int, double> p3(p2); //拷贝构造函数 访问两个元素(通过first和second): pair<int, double> p1; //使用默认构造函数 p1.first = 1; p1.second = 2.5; cout << p1.first << ' ' << p1.second << endl; 输出结果:1 2.5 赋值operator = : (1)利用make_pair: pair<int, double> p1; p1 = make_pair(1, 1.2); (2)变量间赋值: pair<int, double> p1(1, 1.2); pair<int, double> p2 = p1;由于pair类型的使用比较繁琐,因为如果要定义多个形同的pair类型的时候,可以时候typedef简化声明:typedef pair<string, string> author;author pro("May", "Lily");std:tuple固定大小的集合 Defined in header <tuple>场景std::pair 可以打包最多两个值到一个类里,常用在需要返回两个值的函数里,因为可以不需要自己定义一个wrapper类,普通集合类肯定不能用,因为C++的集合只能存储泛型的(相同类型)对象. 如果要存储超过2个不同类型的对象, 可以使用 std::tuple, 它能存储最多10个不同对象类型. 是不是发现Java的集合可以存储任意类型强大很多,因为Java对象有共同的根类型,Object.std::tuple是一个类模板,它能存储固定大小的(10个 vs2010)不同类型对象,它是std::pair的泛化类型.std::tuple 也可以结合std::tie 来接收函数返回时 unpack 集合里的元素.#include "stdafx.h"#include <tuple>#include <set>#include <iostream>#include <map>#include <assert.h>#include <string>#include <utility>std::tuple<int, int> f() // this function returns multiple values{ int x = 6; return std::make_tuple(x, 8); // return {x,7}; in C++17}void TestTuple(){ // heterogeneous tuple construction int n = 1; // std::ref 返回一个引用类型包裹,它实现了一个引用类型的 类型转换操作符. auto t = std::make_tuple(10, "Test", 3.14, std::ref(n), n, 10); // 注意 n 的值已经改变,tuple里的n引用值也相应改变. n = 7; std::cout << "The value of t is " << "(" << std::get<0>(t) << ", " << std::get<1>(t) << ", " << std::get<2>(t) << ", " << std::get<3>(t) << ", " << std::get<4>(t) << ")\n"; // function returning multiple values int a, b; // 注意,这个是模板函数,虽然是可变参个数,但是也是有个数限制的. // std::tie 返回一个绑定了左值变量的tuple. std::tie(a, b) = f(); std::cout << a << " " << b << "\n"; std::set<std::string> set_of_str; bool inserted = false; // tuple可以把pair转换为tuple. /* std::ignore :任何值均可赋给而无效果的未指定类型的对象。目的是令 std::tie 在解包 std::tuple 时作为不使用的参数的占位符使用。 示例 解包 set.insert() 所返回的 pair ,但只保存布尔值。 std::ignore 一种未指定类型的对象,任何值都可以被分配给它,但没有任何效果。用于std::tuple,作为不使用的参数的占位符。*/ std::tie(std::ignore, inserted) = set_of_str.insert("Test"); //unpack a pair returned by set.insert(), but only save the boolean. if (inserted) { std::cout << "Value was inserted sucessfully\n"; }}int _tmain(int argc, _TCHAR* argv[]){ TestTuple(); system("pause"); return 0;}转载地址:https://blog.csdn.net/yhc166188/article/details/79959602 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
不错!
[***.144.177.141]2024年04月03日 19时49分52秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux下启动rpc时提示Cannot register service: RPC: Unableto receive; errno = Connectionrefused的问题
2021-07-02
Google纪念遗传学之父孟德尔诞辰一百周年图标
2021-07-02
在Apache下配置多个虚拟主机站点
2021-07-02
Apache中目录权限访问控制配置
2021-07-02
Apache的认证和授权配置
2021-07-02
【学习笔记】Linux下CPU性能评估
2021-07-02
【学习笔记】Linux下内存性能评估
2019-04-29
【学习笔记】Linux下磁盘IO性能评估
2019-04-29
【学习笔记】Mysql中通过profiling定位query性能瓶颈
2019-04-29
2011年网上购书清单
2019-04-29
质量管理专家——戴明的14点说
2019-04-29
软件测试需要思考的问题?
2019-04-29
软件问题的分类与管理
2019-04-29
易用性测试关注点
2019-04-29
人生少走弯路的10条忠告
2019-04-29
测试管理工具TestDirector安装部署及常见问题解决方法
2019-04-29
CMMI中与测试直接相关的两个PA VER VAL
2019-04-29
CMMI标准名词术语
2019-04-29
CMMI L3学习考核基础试题(测试类)
2019-04-29