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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Google Protocol Buffer 的使用和原理
下一篇:Solidity语言简介

发表评论

最新留言

不错!
[***.144.177.141]2024年04月03日 19时49分52秒