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