C++ std::pair 与 std::make_pair

std::pair主要的作用是将两个数据组合成一个数据,两个数据可以是同一类型或者不同类型。例如std::pair<int,float> 或者 std::pair<double,double>等。pair实质上是一个结构体,其主要的两个成员变量是first和second,这两个变量可以直接使用。初始化一个pair可以使用构造函数,也可以使用std::make_pair函数,make_pair函数的定义如下:

template pair make_pair(T1 a, T2 b) {  return  pair(a, b); }

一般make_pair都使用在需要pair做参数的位置,可以直接调用make_pair生成pair对象。 另一个使用的方面就是pair可以接受隐式的类型转换,这样可以获得更高的灵活度。但是这样会出现如下问题:例如有如下两个定义:

 

std::pair < int float > ( 1 1.1 );

std::make_pair(
1 1.1 );

其中第一个的second变量是float类型,而make_pair函数会将second变量都转换成double类型。这个问题在编程是需要引起注意。下面是一段pair与make_pair的例子程序:

 1  #include  < iostream >
 2  #include  < utility >
 3  #include  < string >
 4  using   namespace  std;
 5 
 6  int  main () {
 7    pair  < string , double >  product1 ( " tomatoes " , 3.25 );
 8    pair  < string , double >  product2;
 9    pair  < string , double >  product3;
10 
11    product2.first  =   " lightbulbs " ;      //  type of first is string
12    product2.second  =   0.99 ;             //  type of second is double
13 
14    product3  =  make_pair ( " shoes " , 20.0 );
15 
16    cout  <<   " The price of  "   <<  product1.first  <<   "  is $ "   <<  product1.second  <<   " \n " ;
17    cout  <<   " The price of  "   <<  product2.first  <<   "  is $ "   <<  product2.second  <<   " \n " ;
18    cout  <<   " The price of  "   <<  product3.first  <<   "  is $ "   <<  product3.second  <<   " \n " ;
19     return   0 ;
20  }

其运行结果如下:

1  The price of tomatoes  is  $ 3.25
2  The price of lightbulbs  is  $ 0.99
3  The price of shoes  is  $ 20

为了更好的了解pair与make_pair的机制,下面是其定义:

 1  //  TEMPLATE STRUCT pair
 2  template < class  _Ty1, class  _Ty2 >   struct  pair
 3  {   //  store a pair of values
 4      typedef pair < _Ty1, _Ty2 >  _Myt;
 5      typedef _Ty1 first_type;
 6      typedef _Ty2 second_type;
 7 
 8      pair(): first(_Ty1()), second(_Ty2())
 9          {     //  construct from defaults
10          }
11 
12      pair( const  _Ty1 &  _Val1,  const  _Ty2 &  _Val2): first(_Val1), second(_Val2)
13          {     //  construct from specified values
14          }
15 
16      template < class  _Other1,
17           class  _Other2 >
18          pair( const  pair < _Other1, _Other2 >&  _Right)
19          : first(_Right.first), second(_Right.second)
20          {     //  construct from compatible pair
21          }
22 
23       void  swap(_Myt &  _Right)
24          {     //  exchange contents with _Right
25          std::swap(first, _Right.first);
26          std::swap(second, _Right.second);
27          }
28 
29      _Ty1 first;     //  the first stored value
30      _Ty2 second;     //  the second stored value
31      };
32 
33
34  template < class  _Ty1, class  _Ty2 >  inline
35      pair < _Ty1, _Ty2 >  make_pair(_Ty1 _Val1, _Ty2 _Val2)
36      {     //  return pair composed from arguments
37       return  (pair < _Ty1, _Ty2 > (_Val1, _Val2));
38      }


你可能感兴趣的:(Make)