pair(对组)

来源:互联网 发布:韦德2006年总决赛数据 编辑:程序博客网 时间:2024/05/17 04:18

struct pair可以将两个值视为一个单元,c++标准程序库内多处使用了这个struct,尤其在map与multimap中就是使用pair来管理其键值/实值(key/value)的成对元素,任何函数返回两个值也需要pair,pair定义于<utility>中

name std{template<class T1, class T2>struct pair{typedef T1 first_type ;typedef T2 second_type ;T1 first ;T2 second ;pair():first(T1()), second(T2()){}pair(const T1& a, const T2& b):first(a), second(b) {}template<class U, class V>pair(const pair<U, V>& p):first(p.first), second(p.second){}};template <class T1, class T2>bool operator== (const pair<T1, T2>&, const pair<T1, T2>&) ;template <class T1, class T2>bool operator< (const pair<T1, T2>&, const pair<T1, T2>&) ;template <class T1, class T2>pair<T1, T2> make_pair(const T1&, const T2&) ;.....};
pair是作为struct而不是class的类模板,所以其成员都是public可以直接存取,其中default函数调用各自类型的default函数进行初始化

std::pair<int, float> p;就是以int(),float()来初始化p,这两个构造函数都是返回0值。

这里之所以使用template形式的copy构造函数,是因为构造过程中可能需要隐式型别的转换,如果pair对象被复制,调用的是由系统隐式生成的copy构造函数:

void f(std::pair<int, const char*>) ;void g(std::pair<const int, std::string>) ;void foo{std::pair<int, const char*> p(42, "hello") ;f(p) ;//calls built-in default copy constructorg(p) ;//calls template constructor}

ps:隐式转换:加入类 A定义一个这样的构造函数A(int ) ; 我们调用的函数的形式是function(A   a),而此时我只传过去一个int参数如function(3),则会发生隐式转换,通过调用A(int)函数生成A类型的队形

pair对象的比较:如果两个pair对象的所有元素都相等,这两个pair对象就被视为相等:

namespace std{template<class T1, class T2>bool operator== (const pair<T1, T2>& x, const pair<T1, T2>& y){return x.first == y.first && x.second == y.second ;}}
两个pairs互相比较时,第一个元素具有较高的优先级,只有在第一个元素相等时才比较第二个元素

namespace std{template <class T1, class T2>bool operator< (const pair<T1, T2>& x, const pair<T1,T2>& y){return x.first < y.first ||(!(y.first < x.first) && x.second < y.second) ;}}
便捷函数:make_pair()

template函数make_pair()使你无需写出型别,就可以生成一个pair对象:

namespace std{template <class T1, class T2>pair<T1, T2> make_pair(const T1& x, const T2& Y){return pair<T1, T2> (x, y) ;}}
当生成一个对象时,我们可以这样std::make_pair(42, '@') ;而无需麻烦的写std::pair<int, char>(42, '@')

当有必要对一个接受pair参数的函数楚地值时,此时make_pair()很方便

void f(std::pair<int, const char*>) ;void g(std::pair<const int, std::string>) ;void foo{f(std::make_pair(42, "hello")) ;g(std::make_pair(42, "hello")) ;}
从例子中可以看出,make_pair()使得”将两个值当做一个pair参数来传递“的动作更加容易,即使两个值的型别并不准确,也能在template构造函数提供的支持下顺利工作,在map和multimap中应用的比较多。

std::pair<int, float>(42, 7.77)

std::make_pair(42, 7.77)

上一个表达式中是作为float的,后一个作为默认的double在重载函数和模板中应用的时候需要注意了



原创粉丝点击