STL之pair类型详细分析

STL的<utility>头文件中描述了一个非常简单的模板类pair,用来表示一个二元组或元素对,并提供了大小比较的比较运算符模板函数。

pair模板类需要两个参数:首元素的数据类型和尾元素的数据类型。pair模板类对象有两个成员:first和second,分别表示首元素和尾元素。

在<utility>中已经定义了pair上的六个比较运算符:<、>、<=、>=、==、!=,其规则是先比较first,first相等时再比较second,这符合大多数应用的逻辑。当然,也可以通过重载这几个运算符来重新指定自己的比较逻辑。

// map/pair-test.cpp - Show basic use of pair.  
#include <utility>  
#include <iostream>  
#include <string>  
#include <map>  
using namespace std;  
  
int main() {  
    //-- Declare a pair variable.  
    pair<string, int> pr1;  
      
    //-- Declare and initialize with constructor.  
    pair<string, int> pr2("heaven", 7);  
    cout << pr2.first << "=" << pr2.second << endl;  
    // Prints heaven=7  
      
    //-- Declare and initialize pair pointer.  
    pair<string, int>* prp = new pair<string, int>("yards", 9);  
    cout << prp->first << "=" << prp->second << endl;  
    // Prints yards=9  
      
    //-- Declare map and assign value to keys.  
    map<string, string> engGerDict;  
    engGerDict["shoe"] = "Schuh";  
    engGerDict["head"] = "Kopf";  
      
    //-- Iterate over map.  Iterator value is a key-value pair.  
    //   Iteration in map is in sorted order.  
    map<string, string>::const_iterator it;  
    //声明一个map迭代器的指针
    //for体现出的是map迭代器的排列顺序
    for (it=engGerDict.begin(); it != engGerDict.end(); ++it) {  
        cout << it->first << "=" << it->second << endl;  
    }  
    // Prints head=kopf  
    //        shoe=Schuh  
      
    system("PAUSE");  
    return 0;  
}  

除了直接定义一个pair对象外,如果需要即时生成一个pair对象,也可以调用在<utility>中定义的一个模板函数:make_pair。make_pair需要两个参数,分别为元素对的首元素和尾元素

// Illustrates how to use the make_pair function.   
// Functions: make_pair - creates an object pair containing two data  
//                        elements of any type.  
#include <utility>  
#include <iostream>  
  
using namespace std;  
  
/* STL pair data type containing int and float 
*/  
  
typedef struct pair<int,float> PAIR_IF;  
  
int main(void)  
{  
  PAIR_IF pair1=make_pair(18,3.14f);  
  
  cout << pair1.first << "  " << pair1.second << endl;  
  pair1.first=10;  
  pair1.second=1.0f;  
  cout << pair1.first << "  " << pair1.second << endl;  
}  

1.pair的应用

      pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存(说简单点就是映射)另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。 简而言之pair就是结构体,主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量

2 make_pair函数

    make_pair都使用在需要pair做参数的位置,可以直接调用make_pair生成pair对象很方便

           1.   利用make_pair进行赋值运算!!!

                    pair<int, double> p1;

                    p1 = make_pair(1, 1.2);

           2.   pair可以接受隐式的类型转换,这样可以获得更高的灵活度。灵活度也带来了一些问题!!!

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

扫描二维码关注公众号,回复: 3515372 查看本文章

                    std::make_pair(1, 1.1);

             是不同的,第一个就是float,而第2个会自己匹配成double。

           3.   make_pair创建声明 和 初始化 和 构造方法:

          pair<string,string> name;

          pair<string,vector<int>> data;

                    以上全部调用pair类型的默认构造函数对其成员进行数值初始化,成员初始化为make_pair

                    也能在定义时提供初始化式:

               构造方法:

                     pair<int, double> p1; //使用默认构造函数

                     pair<int, double> p2(1, 2.4); //用给定值初始化

                     pair<int, double> p3(p2); //拷贝构造函数

            4. 创建与赋值小结代码:

#include<iostream>
#include<utility>
#include<string>
using namespace std;
pair<string,int> p;
int main()
{
	string str = "直接复制也可以";
	int  m =19;
//	cin>>p.first>>p.second;            法一
//	p.first=str;p.second=m;            法二
    p = make_pair("ghgfhgfh",m);//法三
	cout<<p.first<<p.second<<endl;
	return 0;
}

3 make_pair函数 及其迭代器的嵌套

         举个例子:map是一个关联容器,里面存放映射,

                             容器中每一元素都是pair类型,通过map的insert()方法来插入元素(pair类型)。

                            

                           在vector中的使用:

                  

#include<iostream>
#include<utility>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
bool strict_weak_ordering(pair<int,string>a,pair<int,string>b)   
  {   return   a.first   <   b.first;   }   
  int   main()   
  {   
        
        vector<pair<int,string> >   vec;   
        vec.push_back(make_pair<int,   string>(5,   "heo"));   
        vec.push_back(make_pair<int,   string>(4,   "hell"));   
        vec.push_back(make_pair<int,   string>(6,   "hlo,"));   
        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->second<<endl;   
  }

       利用vector存储piar类型,并通过sort对各pair类型数据的begin()排序,

       最后借助迭代器输出pair类型数据的second().

猜你喜欢

转载自blog.csdn.net/mlm5678/article/details/82721331