C++-map 以及mulitmap的函式的應用
一、定義
(1) map<string, int> Map; (2) 或者是:typedef map<string,int> Mymap; Mymap Map;
二、插入資料
插入資料之前先說一下pair 和 make_pair 的用法 pair是一個結構體,有first和second 兩個域,可以直接訪問
1 string key="sunquan"; 2 int value=123456; 3 pair <string,int> b(key, value);//這裡 pair <string,string>是資料型別,後面是調帶參構造方法 4 cout<<b.first<<endl;
而make_pair是返回一個pair <型別,型別> 的資料,eg:make_pair("asa",123456); 不過還得找個pair <string,int>型別的變數來接受返回值。 下面步入正題:
(1) Map["abc"]=1; (2) Map.insert(pair<string,int>("c",3)); (3)Map.insert(make_pair<string,int>("d",4));
三、修改和查詢資料
(1)修改Map["sunquan"]=11111;
(2)查詢資料 用Map.find(key); 可以通過鍵來查。
切記不要用int value=Map[key];這樣會在Map中增加這個key,而value就是預設值(int 為0,string為空字串)。
通過方法(2),會返回迭代器的地址,key不存在的話迭代器的值為Map.end();
四、刪除元素
(1)通過key刪除;
(2)通過迭代器來刪除;
下面看一下詳細的程式碼:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <map> 6 using namespace std; 7 8 int main() 9 { 10 map<string,int> Map; 11 map<string,int> ::iterator it; 12 Map.insert(pair<string,int>("root",12)); 13 Map.insert(pair<string,int>("scot",11)); 14 for(it=Map.begin();it!=Map.end();it++) 15 cout<<it->first<<" "<<it->second<<endl; 16 it=Map.begin(); 17 Map.erase(it);//通過迭代器刪除 18 string key="root"; 19 Map.erase(key);//通過key刪除 20 21 Map.erase(Map.begin(),Map.end());//一個迭代器,到另一個迭代器 22 //相當於 Map.clear(); 23 24 for(it=Map.begin();it!=Map.end();it++) 25 cout<<it->first<<" "<<it->second<<endl; 26 return 0; 27 }
注:
map<int, string>::iterator it 是宣告一個 迭代器 map<int, string> it 是 宣告一個map容器
五、c++中map的一些方法
begin() 返回指向map頭部的迭代器 clear() 刪除所有元素 count() 返回指定元素出現的次數 empty() 如果map為空則返回true end() 返回指向map末尾的迭代器
equal_range() 返回特殊條目的迭代器對
erase() 刪除一個元素 find() 查詢一個元素 insert()插入元素 max_size()返回可以容納的最大元素個數 size() 返回map中元素的個數 swap() 交換兩個map
get_allocator() 返回map的配置器 key_comp() 返回比較元素key的函式 lower_bound() 返回鍵值>=給定元素的第一個位置 max_size() 返回可以容納的最大元素個數 rbegin() 返回一個指向map尾部的逆向迭代器 rend() 返回一個指向map頭部的逆向迭代器 upper_bound() 返回鍵值>給定元素的第一個位置 value_comp() 返回比較元素value的函式
六.例項
- //仿函式的應用,這個時候結構體中沒有直接的小於號過載,程式說明
- #include <iostream>
- #include <map>
- #include <string>
- using namespace std;
- typedef struct tagStudentinfo
- {
- int niD;
- string strName;
- }Studentinfo, *PStudentinfo; //學生資訊
- class sort
- {
- public:
- bool operator() (Studentinfo const &_A, Studentinfo const &_B) const
- {
- if(_A.niD < _B.niD)
- return true;
- if(_A.niD == _B.niD)
- return _A.strName.compare(_B.strName) < 0;
- return false;
- }
- };
- int main()
- { //用學生資訊對映分數
- map<Studentinfo, int, sort>mapStudent;
- map<Studentinfo, int>::iterator iter;
- Studentinfo studentinfo;
- studentinfo.niD = 1;
- studentinfo.strName = "student_one";
- mapStudent.insert(pair<Studentinfo, int>(studentinfo, 90));
- studentinfo.niD = 2;
- studentinfo.strName = "student_two";
- mapStudent.insert(pair<Studentinfo, int>(studentinfo, 80));
- for (iter=mapStudent.begin(); iter!=mapStudent.end(); iter++)
- cout<<iter->first.niD<<' '<<iter->first.strName<<' '<<iter->second<<endl;
- }
由於STL是一個統一的整體,map的很多用法都和STL中其它的東西結合在一起,比如在排序上,這裡預設用的是小於號,即less<>,如果要從大到小排序呢,這裡涉及到的東西很多,在此無法一一加以說明。
還要說明的是,map中由於它內部有序,由紅黑樹保證,因此很多函式執行的時間複雜度都是log2N的,如果用map函式可以實現的功能,而STL Algorithm也可以完成該功能,建議用map自帶函式,效率高一些。
下面說下,map在空間上的特性,否則,估計你用起來會有時候表現的比較鬱悶,由於map的每個資料對應紅黑樹上的一個節點,這個節點在不儲存你的 資料時,是佔用16個位元組的,一個父節點指標,左右孩子指標,還有一個列舉值(標示紅黑的,相當於平衡二叉樹中的平衡因子),我想大家應該知道,這些地方 很費記憶體了吧
七.map和multimap相對比,map只能是一對一的關係,multimap可以是一對多的關係。
八.C++ stl Multimap詳細程式碼舉例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
|