c++11 std:pair 和std::tuple元组的使用

原创 2018年04月16日 14:05:05
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

Microsoft .NET vs. J2EE: How Do They Stack Up?

What exactly is the .NET platform [and] how does the .NET architecture measure up against J2EE? ...
  • zdg
  • zdg
  • 2000-12-21 14:53:00
  • 2571

[C/C++11]_[初级]_[使用std::tuple元组-固定大小的集合]

场景 std::pair 可以打包最多两个值到一个类里,常用在需要返回两个值的函数里,因为可以不需要自己定义一个wrapper类,普通集合类肯定不能用,因为C++的集合只能存储泛型的(相同类型)对象....
  • infoworld
  • infoworld
  • 2016-04-24 15:43:19
  • 3545

c++11中的tuple(元组)

转自:http://www.cnblogs.com/qicosmos/p/3318070.html 这次要讲的内容是:c++11中的tuple(元组)。tuple看似简单,其实它是简约而不简...
  • fjb2080
  • fjb2080
  • 2013-11-13 09:36:58
  • 37573

C++11中std::tuple的使用

C++11中std::tuple的使用
  • fengbingchun
  • fengbingchun
  • 2017-06-01 21:33:54
  • 4698

C++ - "tuple"(元组)容器 详解 及 代码

"tuple"(元组)容器 详解 及 代码 本文地址: http://blog.csdn.net/caroline_wendy/article/details/17265569 tuple容器...
  • u012515223
  • u012515223
  • 2013-12-11 16:31:56
  • 12594

C++中std::pair的使用

C++中std::pair的使用
  • fengbingchun
  • fengbingchun
  • 2016-08-14 17:04:25
  • 2641

C++11的tuple用法笔记

#include #include #include using std::cout ; using std::endl ; using std::tuple; using std::vecto...
  • luopeiyuan1990
  • luopeiyuan1990
  • 2016-04-15 09:11:31
  • 2788

C++STL中的tuple 与 pair (piecewise construction)

tuple t(1, 2.22);     pair p1(42, t);     pair p2(piecewise_construct_t, make_tuple(32), t); 看STL...
  • hahahzzzzz
  • hahahzzzzz
  • 2016-05-19 20:35:04
  • 709

C++11:借助std::tuple实现CSV的读写

#ifndef _CSV_TO_TUPLES_H#define _CSV_TO_TUPLES_H#include #include #include #include #include #includ...
  • dynuaa
  • dynuaa
  • 2014-09-27 20:55:18
  • 952

九、 通用工具 ----pair 和Tuple---Tuple

2 std::tuple(不定数的值组)扩展了pair的概念,拥有任意数量的元素。原型;template class tuple;2.1 tuple的操作 make_tuple() : 创建一个tu...
  • jingza
  • jingza
  • 2017-08-24 20:49:58
  • 288
收藏助手
不良信息举报
您举报文章:c++11 std:pair 和std::tuple元组的使用
举报原因:
原因补充:

(最多只允许输入30个字)