不同於順序容器,關聯容器根據元素的鍵(key_type)來組織元素。 關聯容器有set和map兩類,根據unordered、multi修飾共衍生出8種關聯容器。
一般根據是否有序來劃分:
有序關聯容器
無序關聯容器
這樣劃分的依據是它們對關鍵字型別的要求不同
舉例所有不帶unordered字首的關聯容器都是有序關聯容器,關鍵字型別必須提供乙個嚴格小於的比較操作,這個操作可以是過載的operator<,也可以是乙個比較函式(函式型別要求bool (const key_type&,const key_type&))。set< int >
int是key_type也是value_type
map< string,int >
使用比較函式定義有序關聯容器
//自定義型別,我們需要為它提供嚴格小於比較操作
struct mystruct
;
//比較函式
bool cmp(const mystruct& lhs, const mystruct& rhs)
else
}
//自定義型別mystruct的set
setdecltype(cmp)*> s(cmp);
當我們建立乙個容器物件時,才會以構造引數的形式提供真正的比較操作。
無序關聯容器不是用比較運算子來組織元素的,而是用雜湊函式和關鍵字型別的==運算子來組織元素。
無序容器中元素的排列不是輸入順序
無序容器中的元素按照它們的hash值被分配到不同的桶中,因此無序容器中元素的排列次序與新增進容器的次序沒有關係。定義乙個管理自定義型別的無序容器
自定義型別還使用上述的 mystruct
******************************
******************************
******************************
******************************
******************************
雖然我們不能將兩個迭代器相減,但可以通過distance函式來獲取兩個迭代器之間的「距離」,即它們之間相差幾個元素
map系
map遍歷容器
迭代器支援 ++ - - != 等操作,以此來遍歷容器
新增元素
返回值是pair< iterator,bool>,bool值表示插入成功或失敗(map不允許有重複元素),iterator則指向指定關鍵字的元素
刪除元素
下標操作
訪問元素
multimap
multimap允許有重複的鍵值,下面說明其與map在操作上不同的地方
遍歷容器
完全相同
新增元素
由於multimap允許重複的鍵值,因此新增元素不會失敗,insert的返回值是指向新新增元素的迭代器
刪除元素
按鍵值刪是刪除multimap中所有鍵值相等的元素,返回值是可能大於1的
下標操作
multimap不支援下標操作
訪問元素
在multimap中,所有鍵值相同的元素是相鄰儲存的,由於multimap不支援下標操作,所有只能通過迭代器來訪問
set系
set沒有下標操作,其餘操作與map相同
無序容器僅僅不支援lower_bound和upper_bound,其他與有序容器並無不同,在大多數情況下都可以用無序容器替換乙個有序容器。
c 關聯容器
1.map建構函式 mapm 普通初始化 mapm m2 複製初始化法 mapm b,e 另乙個map物件的迭代器初始化法 注意 1 鍵值型別必須定義 操作符號,資料訪問時需要呼叫。2 m aaa 下表訪問方式導致的結果是,若鍵對應的值不存在,則插入該鍵值對應的預設值。2.map插入操作 m.ins...
C 關聯容器
1.關聯容器是通過關鍵字來儲存和訪問資料的。關聯容器分為兩大類 map和set。其中,map是通過鍵值對來操作的,這裡的鍵就是關鍵字,值就是對應的資料。例如 mapm 定義了乙個空的map變數m,它的關鍵字型別是int,關鍵字對應的值的型別是int。可以將map理解成為函式,關鍵字是自變數,關鍵字對...
C 關聯容器
1 關聯容器定義 關聯容器和順序容器的本質差別在於 關聯容器通過鍵 key 儲存和讀取元素,而順序容器 則通過元素在容器中的位置順序儲存和訪問元素。關聯容器 associative containers 支援通過鍵來高效地查詢和讀取元素。兩個基本的關聯容器型別是 map set。map 的元素以鍵 ...