C++中的pair和tuple的基本用法总结
Posted 非晚非晚
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于C++中的pair和tuple的基本用法总结的主要内容,如果未能解决你的问题,请参考以下文章