C++中的pair和tuple的基本用法总结

pair是将2个数据组合成一组数据,类似于map中的key和value放在一起保存,它是由结构体实现,元素分别为first和second。pair被包含在utility头文件中,实现形式如下:

template <class T1, class T2> struct pair;

tuple元组在C++11开始使用,它是一个固定大小的不同类型值的集合。std::pair只能是2个成员,tuple中可以使用3个及以上的数据。

1. pair

当需要使用成对的变量时,可以使用pair替代,类似于struct中的两个元素。

1.1 pair创建和初始化

pair<T1, T2> p1;//默认构造函数
pair<T1, T2> p1(v1, v2);//定义p1并使用(v1, v2)初始化p1
pair<T1, T2> p2(p1);//定义并使用p1初始化p2,拷贝构造
p1 = make_pair(v1, v2);//使用make_pair生成pair
p2 = p1;//pair之间赋值

1.2 pair的使用

  • 访问
pair<T1, T2> p1(v1, v2);//定义p1并使用(v1, v2)初始化p1
p1.first;//第一个元素
p2.second;//第二个元素
  • 使用typedef
typedef pair<string,string> Author;
Author proust("March","Proust");
  • 使用tie获取pair元素值

在某些情况下,函数会以pair对象作为返回值时,可以直接通过std::tie进行接收。比如:

std::pair<std::string, int> getPreson() {
    return std::make_pair("Sven", 25);//返回pair
}
 
int main(int argc, char **argv) {
    std::string name;
    int ages;
    std::tie(name, ages) = getPreson();//使用tie接收
    std::cout << "name: " << name << ", ages: " << ages << std::endl;
    return 0;
}

2. tuple

当需要使用2个或2个以上元素时,可以使用tuple,类似于struct结构。

2.1 tuple的创建和初始化

std::tuple<T1, T2, .., TN> t1;//默认构造函数,元素类型分别为T1、T2... TN.
std::tuple<T1, T2,..., TN> t2(v1, v2, ... TN); //创建并初始化,拷贝构造
std::make_tuple(v1, v2); // 像pair一样也可以通过make_tuple进行创建一个tuple对象
std::tuple<int,char> third (std::make_tuple(20,'b'));//move,from tuple
std::tuple<int,char> sixth (std::make_pair(30,'c'));    // from pair / move
t2 = t1;//tuple之间赋值,拷贝赋值
a = std::make_pair (2,'b');//move from pair
c = std::make_tuple (100L,'Y');       // move assignment移动赋值

1.2 tuple的使用

  • 访问
 std::tuple<int,char> sixth (std::make_pair(30,'c'));
 std::get<0>(sixth);//访问第一个元素
 std::get<1>(sixth);//访问第二个元素
  • 使用tie获取tuple的值
std::tuple<int,float,char> mytuple;
mytuple = std::make_tuple (10, 2.6, 'a');          // packing values into tuple
std::tie (myint, std::ignore, mychar) = mytuple;   // unpacking tuple into variables
std::cout << "myint contains: " << myint << '\n';
std::cout << "mychar contains: " << mychar << '\n';

其中std::ignore表示忽略变量,也可能称为匿名变量,表示不会使用的变量。

  • 获取tuple元素个数
#include <tuple>        // std::tuple, std::tuple_size
std::tuple<int, char, double> mytuple (10, 'a', 3.14);
std::cout << std::tuple_size<decltype(mytuple)>::value;
  • tuple不支持遍历
for(int i=0; i<3; i++)
    std::cout << std::get<i>(mytuple) << " "; //将引发编译错误
  • tuple元素的引用
#include <iostream>
#include <tuple>
#include <functional>
 
int main(int argc, char **agrv) {
 
    std::tuple<std::string, int, float> tp1("Sven Cheng", 77, 66.1);
 
    std::string name;
    int weight;
    float f;
 
    auto tp2 = std::make_tuple(std::ref(name), std::ref(weight), std::ref(f)) = tp1;
 
    std::cout << "Before change: " << '\n';
    std::cout << "name: " << name << ", ";
    std::cout << "weight: " << weight << ", ";
    std::cout << "f: " << f << '\n';
 
    name = "Sven";
    weight = 80;
    f = 3.14;
 
	std::cout << "After change: " << '\n';
	std::cout << "element 1st: " << std::get<0>(tp2) << ", ";
	std::cout << "element 2nd: " << std::get<1>(tp2) << ", ";
	std::cout << "element 3rd: " << std::get<2>(tp2) << '\n';
 
    return 0;
}

输出结果:

Before change: 
name: Sven Cheng, weight: 77, f: 66.1
After change: 
element 1st: Sven, element 2nd: 80, element 3rd: 3.14
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非晚非晚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值