在C++标准库中,pair类最早出现在c++98中,它提供一个简单的类,可以将两种不同(或者相同)的值聚合在一起,类似键值对(key/value)的形式。
而tuple类最早在TR1中引入,是pair类的扩展泛化,允许最多10个不同(或相同)类型的元素。在c++11中,tuple类重新实现了,基于可变参模版,可以容纳任意多的异质元素。
pair类可以把两个元素作为一个整体,用处也比较广,如STL里的map、multimap、unordered_map、unordered_multimap这些键值对容器中,用pair可以很方便的构造出键值对。pair类基本上都可以用在需要两个值作为一个单元的地方。
struct pair定义于<utility>文件中。
构造函数及初始化:
pair<T1, T2> p;
pair<T1, T2> p(val1, val2);
pair<T1, T2> p{val1, val2}; //初始化列表方式
pair<T1, T2> p(rv1, rv2);
pair<T1, T2> p(t1, tv2); //用tuple类型的t1、t2元素初始化
pair<T1, T2> p(p2);
pair<T1, T2> p(rv); //move构造,将rv内容移动至p,允许隐式类型转换
赋值函数:
p = p2; // 允许隐式类型转换
p = rv; // 将rv值move assign给p,允许隐式转换
获取pair成员或给成员赋值:
p.first;
p.second;
get<0>(p);
get<1>(p);
比较函数:
p1 == p2; //先比较p1.first==p2.first,再比较p1.second==p2.second,以下同
p1 != p2;
p1 < p2;
p1 > p2;
p1 <= p2;
p1 >= p2;
交换函数:
p1.swap(p2);
swap(p1, p2);
make_pair构造pair类型变量:
make_pair(val1, val2); 返回一个pair类型变量
auto p = std:pair<int, string>(1, "china");
现在可以如下:
auto p = std::make_pair(1, "china");
注:构造出来的pair类的值类型不一定确切,比如:
你可能需要std::pair<int, float>类型变量,于是可以如下构造:
std::make_pair(12, 34.5)
但是,实际上,上边构造出来的却是std:pair<int, double>类型的变量。
1)make_pair里的value使用std:move移动语义
std::string val1, val2;
....
auto p = std::make_pair(std::move(val1), std::move(val2));
...//确定此后val1,val2不再使用了
2)make_pair里的value引用外面的变量,使用ref或者cref的引用语义
#include <utility>
#include <functional>
int i = 0;
string str("test");
auto p = std::make_pair(std::ref(i), std::ref(str)); //创建pair<int &, string &>
++p.first; //i++
p.second = "fasd"; // str = "fasd"
tuple操作
tuple类定义于<tuple>文件中,tuple操作接口跟pair大致相同。
构造函数:
tuple<T1, T2,..., Tn> t;
tuple<t1,T2,...,Tn> t(val1, val2,..., valn);
tuple<T1, T2> t(p); //用pair初始化tuple,此tuple就两个成员
tuple<T1, T2,..., Tn> t{v1, v2,...,vn}; //初始化列表方式
赋值函数:
t = t2;
t = p; //pair类型的p,赋值给tuple类型的t(仅俩成员),类型必须匹配
比较函数:(使用字典式比较法则)
t1 == t2;
t1 != t2;
t1 < t2;
t1 <= t2;
t1 > t2;
t1 >= t2;
交换函数:
t1.swap(t2);
swap(t1, t2);
获取成员变量及赋值:
tuple<int, float, string, int> t(12, 3.6, "test", 34);
int val1 = std::get<0>(t); //获取第一个成员值
std::get<0>(t) = 11; //修改第一个成员变量值
make_tuple构造tuple:
make_tuple(val1, val2, ...);
tie函数:
tie(ref1, ref2,...);
它是构造出一个由引用变量组成的tuple,并允许tuple提取出个别数值。
1)make_tuple与引用语义
std::tuple <int, float, string> t(1, 2.4, "test");
int i;
float f;
string s;
std::make_tuple(std::ref(i), std::ref(f), std::ref(s)) = t;
// 此时i,f,s的值被赋值成t对应的元素的值了。
2)tuple与tie
std::tuple<int, float, string> t(1, 2.4, "test");
int i;
float f;
string s;
std::tie(i, f, s) = t;
//此时,tie将i,f,s的引用组建立成tuple,将i,f,s的值分别赋值为t对应的元素的值
std::tie(i, std::ignore, s) = t; //只提取i,s部分的元素,忽略中间的float成员