1. 程式人生 > >c++STL map用法(轉)

c++STL map用法(轉)

此文章源於博主(sunshinewave),轉到自己部落格以後方便檢視 map是STL的一個關聯容器,它提供一對一(其中第一個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的資料處理能力,由於這個特性,它完成有可能在我們處理一對一資料的時候,在程式設計上提供快速通道。這裡說下map內部資料的組織,map內部自建一顆紅黑樹(一種非嚴格意義上的平衡二叉樹),這顆樹具有對資料自動排序的功能,所以在map內部所有的資料都是有序的,後邊我們會見識到有序的好處。 下面舉例說明什麼是一對一的資料對映。比如一個班級中,每個學生的學號跟他的姓名就存在著一一對映的關係,這個模型用map可能輕易描述,很明顯學號用int描述,姓名用字串描述(本篇文章中不用char *來描述字串,而是採用STL中string來描述),下面給出map描述程式碼:
  1. map<
    int, string> mapStudent;  
1.map的建構函式 map共提供了6個建構函式,這塊涉及到記憶體分配器這些東西,略過不表,在下面我們將接觸到一些map的構造方法,這裡要說下的就是,我們通常用如下方法構造一個map:
  1. map<int, string> mapStudent;  
2.資料的插入 在構造map容器後,我們就可以往裡面插入資料了。這裡講三種插入資料的方法: 第一種:用insert函式插入pair資料,下面舉例說明(以下程式碼雖然是隨手寫的,應該可以在VC和GCC下編譯通過,大家可以執行下看什麼效果,在VC下請加入這條語句,遮蔽4786警告  #pragma warning (disable:4786) )
  1. #include <map>
  2. #include <string>
  3. #include <iostream>
  4. usingnamespace std;  
  5. int main()  
  6. {  
  7.        map<int, string> mapStudent;//pair<int,string>p;p=make_pair(v1,v2);<span style="color: rgb(255, 0, 0); background-color: rgb(240, 248, 255); font-family: Arial; font-size: 13px; "> </span>
  8.        mapStudent.insert(pair<int, string>(1, "student_one"));  
  9.        mapStudent.insert(pair<int, string>(2, "student_two"));  
  10.        mapStudent.insert(pair<int, string>(3, "student_three"));  
  11.        map<int, string>::iterator  iter;  
  12.        for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)  
  13.        {  
  14.           cout<<iter->first<<"  "<<iter->second<<endl;  
  15.        }  
  16. }  
  1. make_pair()//返回型別為對應的pair型別
  2. 無需寫出類別,就可以生成一個pair物件  
  3. 例:  
  4. make_pair(1,'@')  
  5. 而不必費力的寫成  
  6. pair<int ,char>(1,'@')  
第二種:用insert函式插入value_type資料,下面舉例說明
  1. #include <map>
  2. #include <string>
  3. #include <iostream>
  4. usingnamespace std;  
  5. int main()  
  6. {  
  7.        map<int, string> mapStudent;  
  8.        mapStudent.insert(map<int, string>::value_type (1, "student_one"));  
  9.        mapStudent.insert(map<int, string>::value_type (2, "student_two"));  
  10.        mapStudent.insert(map<int, string>::value_type (3, "student_three"));  
  11.        map<int, string>::iterator  iter;  
  12.        for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)  
  13.        {  
  14.            cout<<iter->first<<" "<<iter->second<<endl;  
  15.        }  
  16. }  
第三種:用陣列方式插入資料,下面舉例說明
  1. #include <map>
  2. #include <string>
  3. #include <iostream>
  4. usingnamespace std;  
  5. int main()  
  6. {  
  7.        map<int, string> mapStudent;  
  8.        mapStudent[1] =  "student_one";  
  9.        mapStudent[2] =  "student_two";  
  10.        mapStudent[3] =  "student_three";  
  11.        map<int, string>::iterator  iter;  
  12.        for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)  
  13.        {  
  14.           cout<<iter->first<<"   "<<iter->second<<endl;  
  15.        }  
  16. }  
以上三種用法,雖然都可以實現資料的插入,但是它們是有區別的,當然了第一種和第二種在效果上是完成一樣的,用insert函式插入資料,在資料的插入上涉及到集合的唯一性這個概念,即當map中有這個關鍵字時,insert操作是插入資料不了的,但是用陣列方式就不同了,它可以覆蓋以前該關鍵字對應的值,用程式說明
  1. mapStudent.insert(map<int, string>::value_type (1, "student_one"));  
  2. mapStudent.insert(map<int, string>::value_type (1, "student_two"));  
上面這兩條語句執行後,map中1這個關鍵字對應的值是"student_one",第二條語句並沒有生效,那麼這就涉及到我們怎麼知道insert語句是否插入成功的問題了,可以用pair來獲得是否插入成功,程式如下
  1. Pair<map<int, string>::iterator, bool> Insert_Pair;  
  2. Insert_Pair = mapStudent.insert(map<int, string>::value_type (1, "student_one"));  
我們通過pair的第二個變數來知道是否插入成功,它的第一個變數返回的是一個map的迭代器,如果插入成功的話Insert_Pair.second應該是true的,否則為false。 下面給出完成程式碼,演示插入成功與否問題
  1. #include <map>
  2. #include <string>
  3. #include <iostream>
  4. usingnamespace std;  
  5. int main()  
  6. {  
  7.        map<int, string> mapStudent;  
  8.        Pair<map<int, string>::iterator, bool> Insert_Pair;  
  9.        Insert_Pair = mapStudent.insert(pair<int, string>(1, "student_one"));  
  10.        If(Insert_Pair.second == true)  
  11.        {  
  12.              cout<<"Insert Successfully"<<endl;  
  13.        }  
  14.        Else  
  15.        {  
  16.               cout<<"Insert Failure"<<endl;  
  17.        }  
  18.        Insert_Pair = mapStudent.insert(pair<int, string>(1, "student_two"));  
  19.        If(Insert_Pair.second == true)  
  20.        {  
  21.               cout<<"Insert Successfully"<<endl;  
  22.        }  
  23.        Else  
  24.        {  
  25.               cout<<"Insert Failure"<<endl;  
  26.        }  
  27.        map<int, string>::iterator  iter;  
  28.        for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)  
  29.        {  
  30.             cout<<iter->first<<"   "<<iter->second<<endl;  
  31.        }  
  32. }  
大家可以用如下程式,看下用陣列插入在資料覆蓋上的效果
  1. 相關推薦

    c++STL map用法

    此文章源於博主(sunshinewave),轉到自己部落格以後方便檢視 map是STL的一個關聯容器,它提供一對一(其中第一個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的資料處理能力,由於這個特性,它完成有可能在我們處理一對一

    C++ STL快速入門

    在數月之前的機試中第一次體驗到STL的威力,因為自己本來一直在用C語言做開發,很多資料結構都是自己造的,比如連結串列、佇列等,第一次接觸C++ STL後發現這些資料結構都已經給我提供好了,我直接拿去呼叫就好了,真是超級方便。最近的專案中也遇到了STL一些容器,所以現在

    Linux c —— opendir函數和readdir函數內涵及用法

    har code pan 接下來 () cat AD con size_t opendir函數 頭文件:#include <sys/types.h> #include <dirent.h> 函數:DIR *opendir(const char *n

    __cplusplus的用法

    縮進 def com 頭文件 需要 c/c++ bsp c++編譯 可能 經常在/usr/include目錄下看到這種字句: #ifdef __cplusplusextern "C" {#endif...#ifdef __cplusplus}#endif 不太明白是

    oracle nologging用法

    而是 array 類型 無效 data 還得 模式 dddd reat 一、oracle日誌模式分為(logging,force logging,nologging) 默認情況是logging,就是會記錄到redo日誌中,force logging是強制記錄日誌,nolog

    vim map nmap

    sheng blog right lang reset expr color omap 沒有 轉自:http://blog.csdn.net/taoshengyang/article/details/6319106 有五種映射存在 - 用於普通模式: 輸入命令時。

    el 表達式用法

    dex 循環 function 大致 哪裏 字符串 用戶 不同 ken el 表達式用法(轉) 1、EL簡介 1)語法結構 ${expression} 2)[]與.運算符 EL 提供.和[]兩種運算符來存取數據。 當要存取的屬

    phpcms標簽用法

    dot 指定 listorder 萬能 省略號 upd 關聯 blank bsp 1.顯示指定catid的欄目名稱和鏈接 {$CATEGORYS[25][‘catname‘]} {$CATEGORYS[25][‘url‘]} 獲取父欄目id/獲取父欄目名稱 $CATEG

    java中正則表達式基本用法

    code ack acea print 表達式 劃線 跟著 以及 n) https://www.cnblogs.com/xhj123/p/6032683.html 正則表達式是一種可以用於模式匹配和替換的規範,一個正則表達式就是由普通的字符(例如字符a到z)以及特殊字符(元

    關於重定向RedirectAttributes的用法

    richtext ... redirect 傳參 body code path cnblogs control 原文地址:https://zhuanlan.zhihu.com/p/21353217?refer=pengsong-java RedirectAttributes

    hadoop控制map個數

    設置 mapred log AI 不能 map 整體 details net 原文鏈接:https://blog.csdn.net/lylcore/article/details/9136555 hadooop提供了一個設置map個數的參數mapred.map.ta

    Linux date命令的用法

    字符 系統 顯示日期 文件夾 函數 block 只需要 sat 小時 1、顯示時間 date命令可以按照指定格式顯示日期,只鍵入date則以默認格式顯示當前時間。如下: 如果需要以指定的格式顯示日期,可以使用“+”開頭的字符串指定其格式,詳細格式如下: %n : 下一行

    UpdateData的用法

    原文轉自 https://blog.csdn.net/ddjj_1980/article/details/51452289   UpdateData(TRUE)——重新整理控制元件的值到對應的變數。(外部輸入值交給內部變數)即:控制元件的值—>變數。UpdateData(FALSE)——

    C++ vector的用法整理

    vector 是向量型別,它可以容納許多型別的資料,如若干個整數,所以稱其為容器。vector 是C++ STL的一個重要成員,使用它時需要包含標頭檔案: #include<vector>; 一、vector 的初始化:可以有五種方式,舉例說明如下: (1) vector&

    C# AOP框架入門

    出處:https://www.cnblogs.com/isaboy/p/Csharp_AOP_Log.html AOP面向切面程式設計(Aspect Oriented Programming),是通過預編譯方式和執行期動態代理實現程式功能的統一維護的一種技術。Spring框架用的核心技術就是AOP,是

    C++ 常數程式碼技巧

    C++ 程式碼小技巧(一) 在寫程式碼的時候,我們常常會用一些小技巧,下面做簡單介紹 一、o1+o2+o3(常數優化) 如題,開優化開關。 洛谷上有O2優化選項,當然,你也可以這樣:在程式碼開頭這樣加一句: #pragma GCC optimize("O1") #p

    scala中sorted,sortby,sortwith的用法

    scala中sorted,sortWith,sortBy用法詳解 2017年07月23日 23:07:51 bitcarmanlee 閱讀數:9249 版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/bitcarmanle

    pthread_mutex_lock用法

    條件變數      條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作:一個執行緒等待"條件變數的條件成立"而掛起;另一個執行緒使"條件成立"(給出條件成立訊號)。為了防止競爭,條件變數的使用總是和一個互斥鎖結合在一起。  

    Java產生隨機數用法及基本用法

    1.隨機產生四位數[1000,9999] num=(int)(Math.random()*9000)+1000; Math.random()方法是產生double型[0,1)的資料,[0,1)*9000=[1,9001),用int型別強轉後便是[0,8999], 因而可以得到1000~9

    C語言中 .h檔案和.c檔案的區別

    要理解.c檔案與.h檔案有什麼不同之處,首先需要弄明白編譯器的工作過程,一般說來編譯器會做以下幾個過程:1.預處理階段2.詞法與語法分析階段3.編譯階段,首先編譯成純彙編語句,再將之彙編成跟CPU相關的二進位制碼,生成各個目標檔案4.連線階段,將各個目標檔案中的各段程式碼進行絕對地址定位,生成跟特定平臺相關