C++ 标准库读书杂记五

1.pair 可将两个value视为一个单元。

pair是结构体,所以所有成员都是public的

namespace std{
    template <typename T1, typename T2>
    struct pair{
    T1 first;
    T2 second;
    ...
    }
}

成员:

pair<T1,T2> p; //默认构造函数

pair<T1,T2> p(valL,valL); //默认构造函数,并赋初值

pair<T1,T2> p(p2); //拷贝构造函数

pair<T1,T2> p(RV); //right move ,将RV内容移至P,允许饮食类型转换

p = p2;//将P2赋值给P

p = rv ;//jiang RV 的值 move assign 给p

p.first ;//获得pair内的第一个value 

p.second ;//获得pair内的第二个value 

get<0>(p);//获得pair内的第一个value 

get<1>(p);//获得pair内的第二个value 

p1 == p2;//对应值都相等

p1 != p2;

p1 < p2;//先比较first,再比较second

p1 > p2;

p1 > =p2;

p1 <= p2;

p1 .swap(p2);//呼唤p1和p2的数据

swap(p1,p2);//呼唤p1和p2的数据

make_pair(val1,val2);//返回一个pair ,带有val1和val2的类型和值

demo:

构造函数赋值:分为隐式转换拷贝构造函数,和同类型拷贝构造函数,有元语法决定吧。

逐块式构造:引用构造(T1 &v1,T2 &v2),右值构造(T1 &&v1,T2 &&v2),逐块式构造piecewise_construct_t, tuple<typenmae... Arg1> fisrt_args, tuple<typenmae... Arg2> second_args(在两个tuple,构造pair的时候调用这种构造函数)

make_pair//注意基本类型的隐士转化,c11采用的左值引用,此前采用右值引用(move语意)

std::tie();//???返回一个tuple.。将一个类型,转换为一个tuple,并可选择保留的值。

std::tie
  C++  Utilities library std::tuple 
Defined in header <tuple>
template< class... Types >
tuple<Types&...> tie( Types&... args ) noexcept;
(since C++11) 
(until C++14)
template< class... Types >
constexpr tuple<Types&...> tie( Types&... args ) noexcept;
(since C++14)
Creates a tuple of lvalue references to its arguments or instances of std::ignore.

用tuple<const char*, int>tp就可以不用创建这个结构体了,而作用是一样的,是不是更简洁直观了。还有一种方法也可以创建元组,用std::tie,它会创建一个元组的左值引用。

auto tp = return std::tie(1, "aa", 2);
//tp的类型实际是:
std::tuple<int&,string&, int&>

再看看如何获取它的值:

const char* data = std::get<0>(); //获取第一个值
int len = std::get<1>(); //获取第二个值

还有一种方法也可以获取元组的值,通过std::tie解包tuple

int x,y;
string a;
std::tie(x,a,y) = tp; 

通过tie解包后,tp中三个值会自动赋值给三个变量。

解包时,我们如果只想解某个位置的值时,可以用std::ignore占位符来表示不解某个位置的值。比如我们只想解第三个值时:

std::tie(std::ignore,std::ignore,y) = tp; //只解第三个值了

std::tie:返回一个tuple.。将一个类型,转换为一个tuple,并可选择保留的值。“入参可接受多种数据类型”

#include "stdafx.h"
#include <iostream>
#include <utility>
#include <tuple>

using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	auto p = make_pair('x', 'y');
	char c;
	auto result = tie(ignore, c) = p;
	cout << get<1>(result)<< endl;
	cout << typeid(result).name() << endl;
	system("pause");
}

tuple和vector比较:

vector只能容纳同一种类型的数据,tuple可以容纳任意类型的数据;

vector和variant比较:

二者都可以容纳不同类型的数据,但是variant的类型个数是固定的,而tuple的类型个数不是固定的,是变长的,更为强大。

pair之间的比较:

不细说了。见上文注释。

学习完了pair tuple map 之间的混合编程研读下列链接。

https://www.cnblogs.com/qicosmos/p/3318070.html

猜你喜欢

转载自blog.csdn.net/u012516571/article/details/82319078