#include <
string
>
#include
<
map>
using
namespace
std;
intmain()
資料:
1.對映和多重對映以容器以鍵/值對(pair物件)的形式管理他們的元素,其元素按照
某種標準對鍵進行排列,預設標準為 <.排序時比較pair物件的資料成員first的值.
相等則比較second的值.
2.對映和多重對映
二者惟一區別:對映(map)不允許重複,多重對映(multimap)允許.
使用兩種容器必須包含#include
3.建構函式
cttype ct; 建立空的對映或多重對映,排序標準' <'
cttype ct; ..................排序標準'sortop'
cttype ct(otherct); 建立ct,元素從ohterct複製(排序標準為 <)
cttype ct(ohterct); ...(兩容器排序標準都為sortop)
cttype ct(beg,end); 建立ct,迭代器beg,end-1之間的元素複製給ct
cttype ct(beg,end); . ..............(排序標準為sortop)
eg:map > ss(beg,end)//注意要放空格
3.常用函式
insert(e) 把e插入ct中,若ct是對映,它還會返回插入操作是否成功
注:e為pair物件
insert(pos,e) 把e插入ct中,返回e插入位置,迭代器pos指定搜尋插入點的位置
insert(beg,end) 複製beg和end-1之間所有元素插入到ct中
erase(e) 刪除所有值為e的元素,返回被刪除元素的數目
注:只能輸入某個pair物件的first的值,刪除該物件
erase(pos) 刪除pos指定位置的元素,無返回值
erase(beg,end) 刪除beg和end-1之間的元素,無返回值
clear() 刪除ct中所有元素,經此操作,容器ct為空
find(e) 返回指向第乙個等於e的元素位置的迭代器,沒有則返回ct.end()
注:只能輸入某個pair物件的first的值為條件進行查詢
eg:cout < first;
摘要:當索引是整型,那麼將值與之關聯並不難,但如果資料的關聯值對是其它資料型別怎麼辦呢?庫具備乙個關聯容器,使用它可以很方便地關聯所有型別的資料對。本文將討論 庫的使用方法和技巧。
關聯式資料庫,科學計算應用以及基於web的系統常常需要類似 vector 的容器,其索引可以是如何資料型別,不一定是整數。這樣的容器叫關聯容器,或者 map。例如,目錄服務應用可以將私人姓名作為索引來儲存,**號碼作為其關聯的值:
directory["harry"]=8225687;// 插入 "harry" 並與他的**號碼關聯 iterator it=directory.find("harry");// 獲取 harry 的**號碼其它關聯容器的應用還包括將 urls 對映到 ip 的 dns 伺服器,字典,庫存清單,工資表等等。那麼如何突破整型索引的侷限,實現用其它資料型別作為索引的關聯容器呢?答案是:使用 庫建立和處理關聯容器。
pair 和 map
最近的一篇文章中,我介紹了 tuple 的概念,它是不同型別元素的集合。在這篇文章中,有乙個內容沒有提到,那就是 c++98 標準庫已經具備乙個特殊的 tuple 型別——pair。它將鍵值(也就是第乙個元素)與某個值(第二個值)關聯。例如:
#include //definition of pair #include pair prof_and_course("jones", "syntax"); pair symbolic_const (0, "false");標準庫還定義了乙個輔助函式,方便 pair 型別的建立:
string prof; string course; make_pair(prof,course);//returns pair第一步:構造和初始化乙個 map 物件
假設你正在開發乙個位址簿程式,位址簿包含姓名和 e-mail 位址。類模板 map 在 中定義i,它是乙個使用型別對的關聯容器,第乙個元素是索引,第二個元素是關聯的值。使用方法如下:
#include map addresses;為了新增元素,使用下標算符:
addresses["paul w."]="[email protected]";這裡,串「paul w.」是索引或鍵值,「[email protected]」是其關聯的值。如果該 map 已經包含了此鍵值,那麼當前所關聯的值不會改變:
addresses["paul w."]= "[email protected]"; // 不起作用第二步:搜尋
在不插入元素的情況下,如果你想檢查某個元素是否存在,可以使用 find()成員函式。find()有兩個過載的版本:
iterator find(const key_type& k); const_iterator find(const key_type& k) const;通常,用 typedef 可以使**更可讀一些:
typedef map ::const_iterator cit; cit cit=addresses.find("paul w."); if (cit==addresses.end()) cout << "sorry, no such key" << endl; else cout << cit->first << ''\t'' << cit->second << endl;表示式中 cit->first 和 cit->second 分別返回鍵值及其關聯的值。
第三步:元素遍歷
現在讓我們看乙個更現實的情況。假設你正在經營一家旅行社,每乙個**做一單業務都可以獲得獎金。這些**的資訊儲存在某個檔案中,其格式如下:
bob 35 bob 90 jane 80.25 sue 100 jane 65.5你的應用程式必須彙總所有**的獎金並將每個**的獎金總數顯示出來.首先,建立乙個 map,然後讀取該資料檔案:
map bonuses; string agent; double bonus=0; ifstream bonusfile("bonuses.dat"); if(!bonusfile) while (bonusfile >> agent >> bonus)不管理相不相信,就這麼簡單!且讓我們來分析一下該迴圈。開啟資料檔案之後,while 迴圈讀取每個值對,並將其存入 agent 和 bouns 物件。接著,它將 agent 和 bouns 插入到該 map。此處的關鍵技巧是:如果鍵值(agent)已經存在,那麼 += 操作符便將最新讀取的 bouns 累加到儲存在 map 中當前的 bouns 中。因為表示式:
map[key]返回與鍵值關聯的值。當過載的 += 操作符被呼叫時,該值便被累加到新讀取的 bouns 中。最後累加的和覆蓋 map 中舊的關聯值。記住:當你使用下標算符機制時,純粹的賦值操作並不會改寫現有的值,只有過載的 += 才這麼做。
幸運的是,map 並不包含乙個必須要初始化的鍵值,表示式:
map[key]返回預設的初始化 t,而 t 在上述例子中是 double 型別。預設的初始值為 0。至此,map 包含**及其獎金彙總值對。下面的迴圈用來顯示這些值對,輸出如圖一所示:
for(cit p=bonuses.begin(); p!=bonuses.end(); ++p)
map關聯容器
資料表記錄包含表索引和數值,請對錶索引相同的記錄進行合併,即將相同索引的數值進行求和運算,輸出按照key值公升序進行輸出。輸入描述 先輸入鍵值對的個數 然後輸入成對的index和value值,以空格隔開 輸出描述 輸出合併後的鍵值對 多行 輸入例子 4 0 10 2 1 23 4 輸出例子 0 3 ...
關聯容器map
map是一種key value關聯的容器,第乙個稱為關鍵字,只能在map中出現一次,第二個稱為關鍵字的值。特點 map是一類關聯式容器。它的特點是增加和刪除節點對迭代器的影響很小,除了那個操作節點,對其他的節點都沒有什麼影響。對於迭代器來說,可以修改實值,而不能修改key。1 map是 鍵 值 對的...
關聯容器(三) map
map介紹 關聯容器類,紅黑樹,預設按key公升序排序,集合中每個元素是乙個key value對,key唯一,可通過key快速得到對應的value。常用函式 1 建構函式 賦值 map 預設建構函式 map const map m 拷貝建構函式 map iterator begin,iterator...