關聯容器與順序容器
關聯容器通過鍵(key)存儲和讀取元素,而順序容器則通過元素在容器中的位置順序存儲和訪問元素。
關聯容器(Associative containers)支持通過鍵來高效地查找和讀取元素。兩個基本的關聯容器類型是 map 和 set。 其中map 的元素以鍵-值(key-value)對的形式組織:鍵用作元素在 map 中的索引,而值則表示所存儲和讀取的數據。set 僅包含一個鍵,並有效地支持關於某個鍵是否存在的查詢。
關聯容器類型
一般來說,如果希望有效地存儲不同值的集合,那麼使用 set 容器比較合適,而 map 容器則更適用於需要存儲(乃至修改)每個鍵所關聯的值的情況。在做某種文本處理時,可使用 set 保存要忽略的單詞。而字典則是 map 的一種很好的應用:單詞本身是鍵,而它的解釋說明則是值。 set 和 map 類型的對象所包含的元素都具有不同的鍵,不允許為同一個鍵添加第二個元素。如果一個鍵必須對應多個實例,則需使用 multimap 或 multi set,這兩種類型允許多個元素擁有相同的鍵。
C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm
讀C++ Primer 之構造函數陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm
讀C++ Primer 之智能指針 http://www.linuxidc.com/Linux/2011-08/40177.htm
讀C++ Primer 之句柄類 http://www.linuxidc.com/Linux/2011-08/40175.htm
將C語言梳理一下,分布在以下10個章節中:
注意:關聯容器根據鍵排列元素!所以,在迭代遍歷訪問容器時,是按照鍵的順序訪問元素,而與元素在容器中的存放位置無關!
// count number of times each word occurs in the input
map<string, int> word_count; // empty map from string to int
// get an iterator to an element in word_count
map<string, int>::iterator map_it = word_count.begin(); // *map_it is a reference to a pair<const string, int> objectcout << map_it->first; // prints the key for this element
cout << " " << map_it->second; // prints the value of the element
map_it->first = "new key"; <span ><strong>// error: key is const</strong></span>
++map_it->second; // ok: we can change value through an iterator
對迭代器進行解引用將獲得一個pair對象,其first成員具有const map<K, V>::key_type 類型即存放鍵,而 second成員則為map<K,V>::mapped_type 類型,即存放值。
map <string, int> word_count; // empty map
// insert default initialzed element with key Anna; then assign 1 to its value
word_count["Anna"] = 1;
將發生:
1.在 word_count 中查找鍵為 Anna 的元素,沒有找到。// count number of times each word occurs in the input
map<string, int> word_count; // empty map from string to int
string word;
while (cin >> word)
++word_count[word];
// if Anna not already in word_count,inserts new element with value 1
word_count.insert(map<string, int>::value_type("Anna", 1));
上面語句的實參可以簡化如下兩種方法:
(1) word_count.insert(make_pair("Anna", 1)); (2)使用 typedef typedef map<string,int>::value_type valType;
word_count.insert(valType("Anna", 1));
2、insert的返回值
There can be only one element with a given key in a map. If we attempt to insert an element with a key that is already in the map, then insert does nothing. The versions of insert that take an iterator or iterator pair do not indicate whether or how many elements were inserted. map<string,int> word_count;
int occurs = word_count["foobar"];
但是:使用下標存在一個很危險的副作用:如果該鍵不在 map 容器中,那麼下標操作會插入一個具有該鍵的新元素。
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-07/104619p2.htm