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 constructor
g(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在重载函数和模板中应用的时候需要注意了