標籤:
學習map前, 需掌握pair類型
一.什麼是map
map 是鍵-值 對 的集合. map類型通常可理解為關聯陣列 : 可使用鍵作為下標來擷取一個值, 正如內建數群組類型一樣. 而關聯的本質在於元素的值與某個特定的鍵相關聯, 而並非通過元素在數組中的位置來擷取.
二. map對象的定義
1) 要包含map標頭檔.
#include <map>
2) 定義map對象時, 必須分別指明鍵和值的類型
map<string, int> A;
上述語句定義一個名為A的map對象, 鍵為string類型, 關聯的值為int型.
3) map建構函式
* map<k, v> m; 建立一個空的map對象, 鍵和值分別為k和v
* map<k, v> m (m2) ; 建立m2的副本m, m與 m2必須有相同的鍵值類型
* map<k,v> m (b, e ); 建立m, 儲存迭代器 b和e標記 的範圍內的所有元素的副本, 元素類型必須能轉換為 pair<const k, v>
4) 鍵類型的約束
鍵類型必須定義 < 操作符, 而且該操作符能正確地工作.
例如
map< vector<int>::iterator, int > B; // 正確的定義
map< list<int>::iterator, int> C; //錯誤的定義, 因為list<int>::iterator 類型不支援<操作符.
三, map類定義的類型
map<k, v> :: key_type 鍵的類型
map<k, v> :: mapped_type 鍵所關聯的值的類型
map<k, v> :: value_type 一個pair類型, 它的first元素具有const map<k,v>::key_type 類型, 而 second 元素則為map<k,v>::mapped_type類型.
例如上面定義了 map<string, int> A 的 value_type 類型為 pair<const string, int> 類型
要謹記 value_type 類型是pair類型.
四. 給map 添加元素
有兩種方式: 1. 通過下標操作符 2. insert函數
1) 通過下標操作符
例如,
map <string, int> word_count;
word_count ["Anna"] = 1;
上述語句將發生一下事情:
1. 在word_count中 尋找鍵為 Anna的元素, 沒有找到
2. 將一個新的鍵-值對插入word_count中. 它的鍵是const string 類型的對象, 儲存Anna. 而它的值則採用初始化, 本例中初始化為0.
3. 將這個新的鍵-值對插入word_count中.
4. 讀取新插入的元素, 並將它的值賦為1.
用下標訪問不存在的元素時將導致在map中添加一個新的元素, 它的鍵即為下標值.
2) map::insert的使用
m.insert(e) e必須是value_type類型, 如果e已經存在, 則保持m不變, 返回一個pair類型, 包含指向鍵為e.first的元素的map迭代器, 以及一個bool類型的對象.
m.insert( beg, end ) 插入用迭代器 beg到end範圍內的元素
m.insert ( iter, e)
五. 尋找並讀取map中的元素
1. count
m.count(k) 若找到鍵k,則返回1, 否則返回0.
2. find
m.find(k) 若找到k, 則返回指向該元素的迭代器, 否則返回超出末端的迭代器.
六. 從map中刪除元素
m.erase(k) 刪除鍵為k的元素
m.erase(p) 刪除迭代器p指向的元素
m.erase(b,e) 刪除一段範圍內的元素
七. 遍曆
map < string , int >::const_iterator iter= m.begin();
while ( iter != m.end() )
{
....
}
c++ map