set/multiset/unordered_set和map/multimap/unordered_map基础汇总
引言
在STL中,有兩種很常見的關(guān)聯(lián)容器,分別是set和map,序列容器的元素是按照在容器中的位置來順序保存和訪問的,而關(guān)聯(lián)容器的元素是按關(guān)鍵元素來保存和訪問的。所以關(guān)聯(lián)容器經(jīng)常用在關(guān)鍵字的查找中,效率很高,這里就簡單介紹一下這兩種容器,為下面即將學(xué)到的一種數(shù)據(jù)結(jié)構(gòu)**哈希表(散列表)**做一個基礎(chǔ)鋪墊。
set/multiset/unordered_set容器
簡介
set里面每個元素只存有一個key,保證查詢的高效性,且所有元素都會在插入時被自動排序
set其實就類似于數(shù)學(xué)中的集合
本質(zhì)
set的底層是由紅黑樹實現(xiàn)的(一種平衡二叉搜索樹)
特點
不會出現(xiàn)重復(fù)的元素
會由元素大小自動排序
無法直接修改元素
高效的插入刪除操作
下面介紹一些基本操作(這里就著重介紹set一些不同的,大部分內(nèi)容和之前一些容器的操作是一樣的)
插入和刪除 set增添元素就需要用到insert,因為它并沒有push之類的操作,其余的操作還是有類似的 insert(elem); //在容器中插入元素。 clear(); //清除所有元素 erase(pos); //刪除pos迭代器所指的元素,返回下一個元素的迭代器。 erase(begin, end); //刪除區(qū)間[beg,end)的所有元素 ,返回下一個元素的迭代器。 erase(elem); //刪除容器中值為elem的元素。(這個直接刪除很方便) 查找和統(tǒng)計 ??查找需要尤為注意,因為很多時候都要用到查找操作,一定要注意它的返回值是一個迭代器,還有查找失敗時返回的是set.end() find(key); //查找key是否存在,若存在,返回該鍵的元素的迭代器;若不存在,返回set.end(); count(key); //統(tǒng)計key的元素個數(shù)set和multiset的主要區(qū)別就在于
set不予許插入重復(fù)的數(shù)據(jù)
multiset允許插入重復(fù)的數(shù)據(jù)
對于unordered_set,它和set的區(qū)別在于
unordered_set底層實現(xiàn)是哈希表,所以當(dāng)我們需要使用集合來解決哈希問題時,優(yōu)先選擇unordered_set,因為它的查詢和插入刪除操作是最優(yōu)的;
其實set/multiset/unordered_set這三種區(qū)別不是特被大,這里一些基本操作都是通用的,所以就不重復(fù)介紹了,記住它們間的不同點即可
map/multimap/unordered_map
簡介
map是一種key-value型容器,即所有的數(shù)據(jù)都是pair(pair可以創(chuàng)建一個對組,同時返回的是兩個數(shù)據(jù)pair<type1, type2> p)
pair中第一個元素為key(鍵值),起到索引作用,第二個元素為value(實值),所以可以理解為:map其實就是數(shù)學(xué)中的映射;
本質(zhì)
map的底層實現(xiàn)也是紅黑樹
特點
高效的插入和刪除操作
查找元素迅速(由key找到value)
可以通過key修改value的值
支持[]下標(biāo)訪問
所有元素會根據(jù)元素鍵值(key)進(jìn)行排序(和value無關(guān))
基本操作
構(gòu)造(注意:key和value的類型可以不相同的,如果還是不明白,建議看看pair的操作就清楚了) map<T1, T2> m; 插入和刪除(和set沒什么大區(qū)別) insert(elem); //在容器中插入元素。 這里插入注意一下,有四種插入方法 map<int, int> m;//第一種插入方式m.insert(pair<int, int>(1, 10));//第二種插入方式m.insert(make_pair(2, 20));//第三種插入方式m.insert(map<int, int>::value_type(3, 30));//第四種插入方式m[4] = 40; //重載了[] 這里建議用前兩中的一種,哪個順眼用哪個,后兩種了解即可clear(); //清除所有元素 erase(pos); //刪除pos迭代器所指的元素,返回下一個元素的迭代器。 erase(beg, end); //刪除區(qū)間[beg,end)的所有元素 ,返回下一個元素的迭代器。 erase(key); //刪除容器中值為key的元素。 查找和統(tǒng)計(set一樣) find(key); //查找key是否存在,若存在,返回該鍵的元素的迭代器;若不存在,返回map.end(); count(key); //統(tǒng)計key的元素個數(shù)map和multimap區(qū)別:
map不允許容器中有重復(fù)key值元素
multimap允許容器中有重復(fù)key值元素
map和unordered_map區(qū)別:
unordered_map底層實現(xiàn)是哈希表,查找效率更高,同樣在哈希問題中優(yōu)先選擇;
總結(jié)
這里其實只是簡單介紹了一下set和map,很多東西都有省略,目的其實為了接下來的哈希表的學(xué)習(xí),它們區(qū)別只有真正使用才能體會出來,這里只做一個初步了解就可以了;
總結(jié)
以上是生活随笔為你收集整理的set/multiset/unordered_set和map/multimap/unordered_map基础汇总的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 判断子序列不同的子序列两个字符串的删除操
- 下一篇: 01两数之和(哈希表)