map和set的都是關聯容器,底層實現都是紅黑樹
一、map映射
存儲鍵值對 實例化時需要傳遞兩個類型 一個鍵key的類型 另外一個是值value類型
key唯一 相同的key只會存在一條記錄
key有序 插入指定位置 遍歷時 有序
(1)插入
pair<iterator, bool> insert( const pair<KEY_TYPE,VALUE_TYPE> &val );
pair<KEY_TYPE,VALUE_TYPE>(key,value); 創建一個鍵值對 對象 pair
有兩個屬性 first second
訪問first 訪問到的是key的值
訪問second 訪問到的是value的值
pair<string,int> p("張三",111);
p.first === "張三"
p.second === 111
make_pair(key,value);通過key和value創建一個鍵值對 對象
insert(pair<key_type,value_type>(key,value);
insert(make_pair(key,value);
map[key] = value;
insert 插入時 如果key重復則插入失敗
insert返回的是一個pair<iterator,bool> 對
第二個參數true表示插入成功或者false失敗
第一個參數插入成功時指向該記錄的迭代器
[] 如果key不存在則添加 如果存在則更新value
(2)迭代器
begin() end() rbegin() rend()
map迭代器所指向的數據是一條 key-value 的記錄
(3) size map 中元素的個數 鍵值對的個數
(4) empty
(5) swap
(6) size_type count( const KEY_TYPE &key ); 返回map中鍵值等於key的元素的個數
(7) erase
void erase( iterator pos );
void erase( iterator start, iterator end );
size_type erase( const KEY_TYPE &key );
(8) find
iterator find( const KEY_TYPE &key );
find()函數返回一個迭代器指向鍵值為key的元素,如果沒找到就返回指向map尾部的迭代器。
二、multimap 多重映射
key可重復
(1) 查找key值的范圍
pair equal_range( const key_type &key );
equal_range()函數查找multimap中鍵值等於key的所有元素,返回指示范圍的兩個迭代器
pair<multimap<key_type,value_type>::iterator,multimap<key_type,value_type>::iterator> p
p.first 指向是第一個為key的迭代器
p.second 是最后一個為key的下一個元素的迭代器
iterator upper_bound( const key_type &key );
upper_bound()函數返回一個迭代器,指向multimap中鍵值>key的第一個元素
三、set集合
只有value沒有key ,value不可以重復
四、multiset 多重集合
value可以重復
五、map和set 的區別
1.map中的元素是key-value(關鍵字—值)對:關鍵字起到索引的作用,值則表示與索引相關聯的數據;Set與之相對就是關鍵字的簡單集合,set中每個元素只包含一個關鍵字。
2.set的迭代器是const的,不允許修改元素的值;map允許修改value,但不允許修改key。其原因是因為map和set是根據關鍵字排序來保證其有序性的,如果允許修改key的話,那么首先需要刪除該鍵,然后調節平衡,再插入修改后的鍵值,調節平衡,如此一來,嚴重破壞了map和set的結構,導致iterator失效,不知道應該指向改變前的位置,還是指向改變后的位置。所以STL中將set的迭代器設置成const,不允許修改迭代器的值;而map的迭代器則不允許修改key值,允許修改value值。
3.map支持下標操作,set不支持下標操作。map可以用key做下標,map的下標運算符[ ]將關鍵碼作為下標去執行查找,如果關鍵碼不存在,則插入一個具有該關鍵碼和mapped_type類型默認值的元素至map中,因此下標運算符[ ]在map應用中需要慎用,const_map不能用,只希望確定某一個關鍵值是否存在而不希望插入元素時也不應該使用,mapped_type類型沒有默認值也不應該使用。如果find能解決需要,盡可能用find。