C/C++ pair和make_pair

有时需要将两个不同的变量或者不同的变量类型“绑定”,那么pair和make_pair就可以实现上述功能。

先引入一个使用样例,后面在详细介绍函数内容:

// make_pair example
#include <utility>      // std::pair
#include <iostream>     // std::cout

int main () {
  std::pair <int,int> foo;
  std::pair <int,int> bar;

  foo = std::make_pair (10,20);
  bar = std::make_pair (10.5,'A'); // ok: implicit conversion from pair<double,char>

  std::cout << "foo: " << foo.first << ", " << foo.second << '\n';
  std::cout << "bar: " << bar.first << ", " << bar.second << '\n';

  return 0;
}
Output:

foo: 10, 20
bar: 10, 65

备注:

pair相当于定义一个结构体,两个成员变量是first和second,这两个变量可以直接使用。

可以使用make_pair()初始化pair。

==================介绍========================

一般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类型。 

1.pair

class template
<utility>

std::pair

template <class T1, class T2> struct pair;

Member variables

member variabledefinition
firstThe first value in the pair
secondThe second value in the pair

2.make_pair()

function template
<utility>

std::make_pair

template <class T1, class T2>
  pair<V1,V2> make_pair (T1&& x, T2&& y);  // see below for definition of V1 and V2
Construct pair object
Constructs a pair object with its first element set to x and its second element set to y.

The template types can be implicitly deduced from the arguments passed to make_pair.

pair objects can be constructed from other pair objects containing different types, if the respective types are implicitly convertible.

The function returns:
 
pair<V1,V2>(std::forward<T1>(x),std::forward<T2>(y))
 

Where the types V1 and V2 are the decay equivalents of T1 and T2, respectively (except for reference_wrapper types, for which the corresponding reference type is used instead).

If T1 and/or T2 are rvalue references, the objects are moved and x and/or y are left in an undefined but valid state.

一个使用双关键字排序的样例

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
bool strict_weak_ordering(const pair<int,string> a, const pair<int,string> b)
{
    return a.first > b.first;
}
//通过运算符重载,利用sort函数实现降序排列
int main()
{
    vector<pair<int, string> > vec;
    //为了避免与>>运算符混淆,所以这里中间要有个空格
    vec.push_back(make_pair<int, string>(5, "bingo"));
    vec.push_back(make_pair<int, string>(4, "bing"));
    vec.push_back(make_pair<int, string>(6, "acbingo"));
    vec.push_back(make_pair<int, string>(6, "ACBingo"));
    vec[3].first++;
    sort(vec.begin(), vec.end(), strict_weak_ordering);
    //使用迭代器
    vector<pair<int, string> >::iterator it = vec.begin(), end = vec.end();
    for (;it!=end;++it) cout<<it->first<<endl;
    //模拟正常数组
    for (int i=0;i<vec.size();i++)  cout<<vec[i].second<<endl;
    return 0;
}


1.https://www.cnblogs.com/acbingo/p/4556427.html

2.http://www.cplusplus.com/reference/utility/


阅读更多

没有更多推荐了,返回首页