關聯容器支援通過鍵來高效的查詢和讀取元素。有兩種基本的關聯容器型別:map和set。
pair型別
表示式功能
pairp1;
建立乙個空的pair物件,它的兩個元素分別是ti和t2型別的,採用值初始化。
pairp1(v1, v2);
建立乙個pair物件,它的兩個元素分別是ti和t2型別的,first成員初始化為v1,second成員初始化為v2。
make_pair(v1, v2);
以v1和v2的值建立乙個pair物件,其元素的型別分別是v1和v2的型別。
p1 < p2
兩個pair物件之間的小於運算,其定義遵循字典次序:如果p1.first < p2.first或者!(p2.first < p1.first) && p1.second < p2.second,則返回true。
p1 == p2
如果兩個pair物件的兩個成員分別相等,則兩個物件相等,返回true。
p.first
返回p中的first的資料成員
p.second
返回p中的second的資料成員
關聯型別
關聯容器不支援順序容器中front、push_front、pop_front、back、push_back和pop_back操作。
順序容器和關聯容器相同的操作:
a)三種基礎的建構函式
c c;
cc1(c2)
;cc(b, e)
;
b)關係運算
c)begin、end、rbegin和rend操作
d)swap和賦值操作,但是關聯容器不支援assgin函式
e)clear和erase操作
f)關於容器大小的操作(size),但是關聯容器不支援resize函式。
容器元素是根據鍵的次序排列。在迭代遍歷關聯容器時,可確保按鍵的順序訪問元素,而與元素在容器中的存放位置完全無關。
map型別
map是鍵-值對的集合。map型別可以理解為關聯陣列:可以使用鍵作為下標來獲取乙個值。關聯的本質在於元素的值與某個特定的鍵相關聯,而不同於元素在陣列中的位置來獲取。
專案1map物件的定義
表示式功能mapm;
建立乙個名為m的空map物件,其鍵值的型別分別為k和v
mapm(m2);
建立m2的副本m,m和m2必須具有相同的鍵值型別
mapm(b, e);
建立map型別的物件,儲存迭代器b和e標記範圍內所有元素的副本。元素的型別必須能轉換為pair
鍵型別的約束
使用關聯容器時,它的鍵不僅有乙個型別,而且還有乙個相關的比較函式。預設情況下,標準庫使用鍵型別定義的「<」操作符實現鍵的比較。
所用的比較函式必須在鍵型別上嚴格弱排序的(嚴格是說在判斷的時候會用"<",而不是"<=",弱排序是因為,一旦"<「成立便認為存在」<「關係,返回ture,而忽略了」=「關係和」>"區別,把它們歸結為false)。
個人理解,由於map型別的鍵值是唯一的,所以鍵型別只有「小於」、「大於」兩種關係。如果不滿足「小於」關係,則就是「大於」關係。
對於鍵型別,唯一的約束就是必須支援「<」操作符。對於其他關係操作符沒有具體的要求。
map定義的型別
map物件的元素是鍵-值對,每個元素包含兩個部分,鍵和與鍵相關聯的值。
表示式解釋
map::key_type
在map容器中,用作索引的鍵型別
在map容器中,鍵相關聯的值的型別
map::value_type
map迭代器進行解引用將產生pair型別的物件
對迭代器進行解引用時,將獲得乙個引用,指向容器中乙個value_type型別的值。對於map型別,其value_type型別是pair型別。
mapint>
::iterator map_it = word_count.
begin()
;cout << map_it-
>first;
cout <<
" "
<< map_it-
>second;
map_it.first =
"new"
;//error:因為first成員是const型別
++map_it-
>second;
向map中新增元素
有兩種方式:一是使用insert成員實現;二是先用下標操作符獲取元素,然後給獲取的元素賦值。
map:insert的使用操作
含義m.insert(e)
e是乙個用在m上的value_type型別的值(pair型別)。如果鍵m.first不在m中,則插入乙個值為e.second的新元素;如果m.first在m中已存在,則保持m不變。該函式返回乙個pair型別的物件,包含指向鍵值為e.first元素的map迭代器,以及乙個bool型別的物件,表示是否插入成功
m.insert(beg, end)
beg和end是標記元素範圍的迭代器,其中的元素必須是m.value_type型別的鍵值對。對於該範圍內的所有元素,如果它的鍵不在m中,則將鍵值對插入到m中,返回void型別
m.insert(iter, e)
e是乙個用在m上的value_type型別的值。如果鍵e.first不在m中,則建立新的元素,並以迭代器iter為起點搜尋新元素的儲存位置。返回乙個迭代器,指向m中具有給定鍵值的元素
使用下標訪問map物件
mapint> word_count;
word_count[
"anna"]=
1;
這段程式發生了以下事件:
a)在word_count中查詢鍵值為anna的元素,沒有找到;
b)建立乙個新的鍵值對,這個鍵值對鍵型別是const string型別,值為「anna」。它的值採用值初始化,這裡初始化為0;
c)將這個新的鍵值對插入word_count中;
d)讀取新插入的元素,將其值賦值為1.
使用下標訪問map與使用下標訪問陣列或者vector的行為截然不同:使用下標訪問不存在的元素將導致在map容器中新增乙個新元素,它的鍵值為下標值(類似於動態查詢)。
查詢和讀取map中的元素
雖然通過下標操作符可以訪問map中的元素,但是下標操作也有個嚴重的***就是當元素不在map物件中時,會插入乙個新的元素。
map提供兩種操作count和find,用於檢查某個鍵是否存在且不會插入該鍵。
操作功能
m.count(k)
返回m中k的出現次數
m.find(k)
如果m容器中存在按k索引的元素,則返回指向該元素的迭代器。如果不存在,則返回超出末端的迭代器
從map中刪除元素
刪除操作是通過erase操作實現
操作功能
m.erase(e)
刪除m中鍵為k的元素。返回size_type型別的值,表示刪除的元素個數(只能是0或1)
m.erase§
從m中刪除迭代器p所指向的元素。p必須指向m中確實存在的元素,且不等於m.end()。返回void型別
m.erase(b, e)
從m中刪除一段範圍內的元素,該範圍由迭代器對b和e標記。
set型別
set容器只是單純的鍵的集合。
set容器支援大部分map的操作:
a) 通用的容器操作;
b) map定義的建構函式;
c) insert操作
d) count和find操作
e) erase操作
每日複習筆記
未知數量輸入的解決辦法 利用whlie迴圈 讀入位置數量的輸入 include using namespace std int main cout sum is sum 注意 一般windows系統的檔案結束符是ctrl z unix系統中是 control d。標頭檔案的小細節 標準庫的標頭檔案用...
每日複習筆記4 28
感覺這個部分真的是重難點啊,用好的真好用,用不好是,哎,我是菜雞。有乙個順序容器和順序容器介面卡的概念,這裡先寫點關於順序容器的吧。常見的順序容器有vector list和deque三種。順序容器的定義 所有的容易都是類模板,通過模板可以編寫乙個類定義,而用於多個不同的資料型別。容器元素的初始化 表...
每日複習筆記4 25
函式的定義 函式由函式名以及一組運算元型別唯一的表示。函式體是乙個作用域 函式體是乙個語句塊,定義了函式的具體操作,形成了乙個 新的作用域。可以在函式體內定義變數,這種變數是區域性變數,變數名字只在函式內可見。函式返回型別 函式的返回型別可以是內建型別,類型別或者復合型別 例如引用或者指標 甚至是v...