map的特性是,全部的元素會根據鍵值自動排序。map的全部元素都是pair,同時擁有實值(value)和鍵值(key)。pair的第一個元素被視爲鍵值,第二個被視爲實質
piar 的定義ios
template<class T1,class T2> struct pair{ typedef T1 first_type; typedef T2 second_type; T1 first; //爲public T2 second;//爲public pair():first(T1()),second(T2()){} pair(const T1&a,const T2&b):first(a),second(b){} };
注意:
1.使用map不能修改元素的key,這會影響map元素的排列規則,會破壞map組織
2.能夠修改元素的value
3.標準的STL的map以RB-tree爲底層機制,因爲map所開放的各類操做接口,因此幾乎map操做行爲都是調用RB-tree的操做行爲app
map的源碼less
template<class key,class T,class Copmpare=less<key>,class Alloc=alloc> class map{ public: typedef key key_type; typedef T data_type; typedef T mapped_type; typedef pair<const Key,T>value_type; typedef Compare key_compare; /*如下是定義的仿函數,用於比較排序 class value_compare :public binary_function<value_type,value_type,bool> { firend class map<Key,T,Compare,Alloc>;//與map友元 protect: compare comp; value_compare(Compare c):comp(c){} public: bool operator(const value& x,const value_type&y)const { return comp(x.first ,y.first); } } private: /*如下定義表述型別。以map元素型別(一個pair)的第一型別,做爲RB-tree節點的鍵值型別 typedef rb_tree<key_type,value_type, select<value_type>,key_compare,Alloc>rep_type; rep_type t; public: typedef typename...... //類型名的重命名 map():t(Compare()) {}.........//map的構造以及map的各類操做 }
從map中的源碼首先可看出
1.map和RB-tree的關係
2.map中以pair爲第一型別又被typedef爲value_type
3.比較時用到了仿函數友元函數
如下是測試程序,通過思考pair是結構體,咱們也能夠輸入結構體達到>=2參數的輸入以及使用
//函數
#include "stdafx.h" #include <iostream> #include <string> #include <map> #include <algorithm> using namespace std; struct person { string name; double sore; }; int main() { map<int, person>x; x.insert(map<int, person>::value_type(1,{"zyh",100})); x.insert(map<int, person>::value_type(3, { "zlw",10 })); x.insert(map<int, person>::value_type(2, { "hyf",1 })); x.insert(map<int, person>::value_type(4, { "slj",3 })); pair<int, person>value(5,{ "srx",234 });//另一種插入方式 x.insert(value); map<int, person>::iterator it = x.begin();//使用迭代器輸出 for (; it != x.end(); it++) { cout << it->first << ' ' ; cout << it->second.name << ' '; cout << it->second.sore << endl; } }