1. 程式人生 > >STL之pair型別詳細分析

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);

                    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().