c++11下的 std::pair & std::tuple用法

  • Post author:
  • Post category:其他


在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成员



版权声明:本文为weixin_42915431原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。