1. 程式人生 > >C++ map詳解

C++ map詳解

1、map 物件的定義

map<k, v> m;            建立一個名為m的空map物件,其鍵和值得型別分別為k和v
map<k, v> m(m1);        建立m1的副本m,m與m1必須有相同的鍵型別和值型別
map<k, v> m(b, e);      建立map型別的物件m,儲存迭代器b和e標記的範圍內所有元素的副本。元素的型別必須能轉換為pair<const k, v>

2、map類定義的型別

map<K, V>::key_type     在map容器中,用做索引的鍵的型別
map<K, V>
::mapped_type 在map容器中,鍵所關聯的值的型別 map<K, V>::value_type 一個pair型別,它的first元素具有const map<K, V>::key_type型別,而second元素則為map<K, V>::mapped_type型別

map迭代器進行解引用將產生pair型別的物件

3、使用下標訪問map物件

map<string, int> word_count;        //empty map
//insert default initialized element with key Anna; then assign 1 to its value
word_count["Anna"] = 1;

上述程式碼將發生以下事情:

  • 在word_count中查詢鍵為Anna的元素,沒有找到。
  • 將一個新的鍵-值對插入到word_count中。它的鍵是const string型別的物件,儲存Anna.而它的值則採用值初始化,這就意味著在本例中值為0。
  • 將這個新的鍵-值對插入到word_count中
  • 讀取新插入的元素,並將它的值賦為1
int main()
{
    map<string, int> word_count;
    string word;
    cout << word_count["Anna"
]; // print 0 ++word_count["Anna"]; cout << word_count["Anna"] << endl; // print 1 return 0; }

4、map::insert的使用

  • m.insert(e) e是一個用在m上的value_type型別的值。如果鍵(e.first)不在m中,則插入一個值為e.second的新元素;如果該鍵在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中具有給定鍵的元素
//if Anna not already in word_count, inserts new element with value 1
word_count.insert(map<string, int>::value_type("Anna", 1));
//word_count.insert(make_pair("Anna", 1));與上一行效果一樣

5、查詢並讀取map中的元素
不修改map物件的查詢操作

  • m.count(k) 返回m中k的出現次數。對於mpa物件,count成員的返回值只能是0或1。map容器只允許一個鍵對應一個例項,所以count可有效地表明一個鍵是否存在。如果返回值非0,則可以使用下標操作符來獲取該鍵所關聯的值,而不必擔心這樣做會在map中插入新元素。
  • m.find(k) 如果m容器中存在按k索引的元素,則返回指向該元素的迭代器。如果不存在,則返回超出末端迭代器

6、從map中刪除元素

  • m.erase(k) 刪除m中鍵為k的元素。返回size_type型別的值,表示刪除的元素個數
  • m.erase(p) 從m中刪除迭代器p所指向的元素。p必須指向m中確實存在的元素,而且不能等於m.end()。返回void型別
  • m.erase(b, e) 從m中刪除一段範圍內的元素,該範圍由迭代器對b和e標記。b和e必須標記m中的一段有效範圍:即b和e都必須指向m中的元素或最後一個元素的下一個位置。而且,b和e要麼相等(此時刪除的範圍為空),要麼b所指向的元素必須出現在e所指向的元素之前。返回void型別

7、map 物件的迭代遍歷
與其他容器一樣, map同樣提供begin和end運算,以生成用於遍歷整個容器的迭代器

map<string, int> word_count;

...

//get iterator positioned on the first element
map<string, int>::const_iterator map_it = word_count.begin();
//for each element in the map
while (map_it != word_count.end()) {
    //print the element key, value pairs
    cout << map_it->first << " occurs " << map_it->second << "times" << endl;
    ++map_it;  // increment iterator to denote the next element
}