c++primer第十一章關聯容器小結-11

第十一章---關聯容器

1、關聯容器和順序容器的本質差別在於:關聯容器通過存儲和讀取元素,而順序元素通過元素在容器中的位置順序存儲和訪問元

素。雖然關聯容器的大部分行爲與順序容器相同,但其獨特之處在於支持鍵的使用。關聯容器通過鍵來高效的查找和讀取元素,兩個基本的關聯容器爲map和set。map的元素以鍵---值對的形式組織,鍵用作元素在map中的索引,而值表示存儲和讀取的元素。set僅包含一個鍵,並有效地支持關於某個鍵是否存在的查詢。如果希望存儲不同值的集合,使用set比較合適,而map容器更適用於需要存儲個鍵所關聯的值得情況。如在做文本處理時,可使用set保存忽略的單詞,而字典則是map的一種很好的應用。單詞本身是鍵,而釋義則是值,背後是利用哈希函數來實現的,哈希是一種重要的查找數據結構。


2、pair類型
pair包含兩個數據值,與容器一樣,pair也是一種模版類型。在創建pair對象時,必須提供兩個類型名:pair對象所包含的兩個數據成員各自對應的類型名字,這兩個類型不必相同。

pairs 類型提供的操作

pair<T1, T2> p1;

創建一個空的 pair 對象,它的兩個元素分別是T1 和 T2 類型,採用值初始化

pair<T1, T2> p1(v1, v2);

創建一個 pair 對象,它的兩個元素分別是 T1 和 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 對象的 first 和 second 成員依次相等,則這兩個對象相等。該運算使用其元素的 == 操作符

p.first

返回 p 中名爲 first 的(公有)數據成員

p.second

返回 p 的名爲 second 的(公有)數據成員


3、map操作

3.1 map的構造函數
map m;  創建一個名爲m的空map對象,其鍵和值的類型分別爲k和v
map m(m2);  創建m2的副本m,m與m2必須有相同的鍵類型和值類型。
map m(b, e); 創建map類型的對象m,存儲迭代器b和e標記範圍內所有元素的副本。元素的類型
必須能轉換爲 pair

3.2 map定義的類型
map::key_type;    在map容器中,用做索引的鍵的類型
map::mapped_type;  在map容器中,鍵所關聯的值的類型
map::value_type;   一個pair類型,它的first元素具有const map::key_type類型,而second元素則爲map::mapped_type類型。它的值成員可以修改,鍵成員不能修改。
map迭代器進行解引用將產生pair類型的對象。
對迭代器進行解引用操作時,將獲得一個引用,指向容器中一個value_type類型的值,得一個pair對象,first成員存放鍵,爲const,而second成員存放

3.3 給map添加元素
下標行爲的編程意義:
對於map容器,如果下標所表示的鍵在容器中不存在,則添加新元素。

3.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 中具
有給定鍵的元素 

3.5 查找並讀取map中的元素
用下標方法可以獲取一個元素,但是當元素不存在時,就會插入一個元素。
m.count(k) //返回m中k出現的次數
m.find(k) //如果m容器中存在按K索引的元素,則返回指向該元素的迭代。不存在,則返回超出末端迭代器。
讀取元素而不插入該元素
int occurs = 0;
map::iterator it = word_count.find("foobar");
if(it != word_count.end())
occurs = it->second;

3.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標記。


4、set關聯容器

當只想知道一個值是否存在時,使用 set 容器是最適合的。兩種例外包括:set 不支持下標操作符,而且沒有定義 mapped_type 類型。在 set 容器中,value_type 不是 pair 類型,而是與 key_type 相同的類型。它們指的都是 set中存儲的元素類型。這一差別也體現了 set 存儲的元素僅僅是鍵,而沒有所關聯的值。與 map 一樣,set 容器存儲的鍵也必須唯一,而且不能修改。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章