1. 程式人生 > >C++-map 以及mulitmap的函式的應用

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的函式

六.例項

  1. //仿函式的應用,這個時候結構體中沒有直接的小於號過載,程式說明  
  2. #include <iostream>  
  3. #include <map>  
  4. #include <string>  
  5. using namespace std;  
  6. typedef struct tagStudentinfo  
  7. {  
  8.        int      niD;  
  9.        string   strName;  
  10. }Studentinfo, *PStudentinfo; //學生資訊  
  11. class sort  
  12. {  
  13. public:  
  14.     bool operator() (Studentinfo const &_A, Studentinfo const &_B) const  
  15.     {  
  16.         if(_A.niD < _B.niD)  
  17.             return true;  
  18.         if(_A.niD == _B.niD)  
  19.             return _A.strName.compare(_B.strName) < 0;  
  20.     return false;  
  21.     }  
  22. };  
  23. int main()  
  24. {   //用學生資訊對映分數  
  25.     map<Studentinfo, int, sort>mapStudent;  
  26.     map<Studentinfo, int>::iterator iter;  
  27.     Studentinfo studentinfo;  
  28.     studentinfo.niD = 1;  
  29.     studentinfo.strName = "student_one";  
  30.     mapStudent.insert(pair<Studentinfo, int>(studentinfo, 90));  
  31.     studentinfo.niD = 2;  
  32.     studentinfo.strName = "student_two";  
  33.     mapStudent.insert(pair<Studentinfo, int>(studentinfo, 80));  
  34.     for (iter=mapStudent.begin(); iter!=mapStudent.end(); iter++)  
  35.         cout<<iter->first.niD<<' '<<iter->first.strName<<' '<<iter->second<<endl;  
  36. }  

由於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

#include <iostream>

#include <string>

#include <map>

using namespace std;

typedef struct employee

{

//Member Function

public:

employee(long eID, string e_Name, float e_Salary);

//Attribute

public:

long ID;                  //Employee ID

string name;              //Employee Name

float salary;           //Employee Salary

}employee;

//建立multimap的例項,整數(職位編號)對映員工資訊

typedef multimap<int, employee> EMPLOYEE_MULTIMAP;

typedef multimap<int, employee>::iterator EMPLOYEE_IT;           //隨機訪問迭代器型別

typedef multimap<int, employee>::reverse_iterator EMPLOYEE_RIT;  //反向迭代器型別

employee::employee(long eID, string e_Name, float e_Salary)

: ID(eID), name(e_Name), salary(e_Salary) {}

//函式名:output_multimap

//函式功能:正向輸出多重對映容器裡面的資訊

//引數:一個多重對映容器物件

void output_multimap(EMPLOYEE_MULTIMAP employ)

{

EMPLOYEE_IT employit;

for (employit = employ.begin(); employit != employ.end(); employit++)

{

cout << (*employit).first << 't' << (*employit).second.ID

<< 't' << (*employit).second.name << 't' << (*employit).second.salary

<< 't' << endl;

}

}

//函式名:reverse_output_multimap

//函式功能:逆向輸出多重對映容器裡面的資訊

//引數:一個多重對映容器物件

void reverse_output_multimap(EMPLOYEE_MULTIMAP employ)

{

EMPLOYEE_RIT employit;

for (employit = employ.rbegin(); employit != employ.rend(); employit++)

{

cout << (*employit).first << 't' << (*employit).second.ID

<< 't' << (*employit).second.name << 't' << (*employit).second.salary

<< 't' << endl;

}

}

int main(int argc, char *argv[])

{

EMPLOYEE_MULTIMAP employees;       //多重對映容器例項

//下面四個語句分別構造一個員工物件插入到多重對映容器

//注意因為是多重對映,所以可以出現重複的鍵,例如下面的資訊有兩個職位編號為118的員工

employees.insert(EMPLOYEE_MULTIMAP::value_type(118, employee(100, "luojiafeng", 8000)));

employees.insert(EMPLOYEE_MULTIMAP::value_type(112, employee(101, "luojiahui", 6000)));

employees.insert(EMPLOYEE_MULTIMAP::value_type(113, employee(102, "luokaifeng", 10000)));

employees.insert(EMPLOYEE_MULTIMAP::value_type(118, employee(103, "xujinghua", 20000)));

//正序輸出多重對映容器中的資訊

cout << "職位編號" << "員工ID" << 't'

<< "姓名" << 't' << 't' << "工資" << endl;

output_multimap(employees);

//逆序輸出多重對映容器中的資訊

cout << "職位編號" << "員工ID" << 't'

<< "姓名" << 't' << 't' << "工資" << endl;

reverse_output_multimap(employees);

//輸出容器內的記錄條數

cout<< "共有" << employees.size() << "條員工記錄" << endl;

return 0;

}