关联式容器(map,set,multimap,multiset)
關(guān)聯(lián)式概念
- STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,這 些容器統(tǒng)稱為序列式容器,因?yàn)槠涞讓訛榫€性序列的數(shù)據(jù)結(jié)構(gòu),里面存儲(chǔ)的是元素本身。
- 關(guān)聯(lián)式容器也是用來存儲(chǔ)數(shù)據(jù)的,與序列式容器不同的是,其里面存儲(chǔ)的是<key, value>結(jié)構(gòu)的鍵值對(duì),在數(shù)據(jù)檢索時(shí)比序列式容器效率更高。
二叉搜索平衡結(jié)構(gòu):
關(guān)于key有序的序列,時(shí)間復(fù)雜度O(logN)
- map<key,value> 要求:key一定不能重復(fù)
- set:key 要求:key一定不可以重復(fù)
- multimap:<key,value> key是可以重復(fù)的
- multiset:key,key可以重復(fù)
鍵值對(duì)
用來表示具有一一對(duì)應(yīng)關(guān)系的一種結(jié)構(gòu),該結(jié)構(gòu)中一般只包含兩個(gè)成員變量key和value,key代表鍵值, value表示與key對(duì)應(yīng)的信息。比如:現(xiàn)在要建立一個(gè)英漢互譯的字典,那該字典中必然有英文單詞與其對(duì)應(yīng) 的中文含義,而且,英文單詞與其中文含義是一一對(duì)應(yīng)的關(guān)系,即通過該應(yīng)該單詞,在詞典中就可以找到與 其對(duì)應(yīng)的中文含義
SGI—STL中鍵值對(duì)的底層實(shí)現(xiàn)
template <class T1, class T2> struct pair { typedef T1 first_type; typedef T2 second_type;T1 first; T2 second; pair() : first(T1()) , second(T2()) {} pair(const T1& a, const T2& b): first(a), second(b) {}};map
map::insert()
通過insert插入數(shù)據(jù)有兩種方式
還可以通過下標(biāo)運(yùn)算符[]
對(duì)于map來說,如果我們提供的key不存在的情況下,他就會(huì)插入這個(gè)數(shù)據(jù)
因?yàn)樗南聵?biāo)運(yùn)算符的底層是這樣實(shí)現(xiàn)的
如果key已經(jīng)存在了,他就不會(huì)插入
void TestMap() {map<string, string>m;m.insert(pair<string,string>("宋江","及時(shí)雨"));m.insert(pair<string, string>("李逵", "黑旋風(fēng)"));//pair<iterator,bool>//iterator:代表map中的一個(gè)key-value的鍵值對(duì)//bool:insert插入是否成功auto ret = m.insert(make_pair("孫二娘","母夜叉"));if (ret.second){cout << (*ret.first).first << "--->" << ret.first->second << endl;}ret = m.insert(make_pair("李逵", "鐵牛"));//key 已經(jīng)存在不會(huì)插入cout << (*ret.first).first << "--->" << ret.first->second << endl;cout << m.size() << endl;cout << m["李逵"] << endl; //把value返回來//用戶提供key---->[]返回key所對(duì)應(yīng)的valuem["李逵"] = "鐵牛"; //修改valuecout << m["李逵"] << endl;m["林沖"] = "豹子頭";cout << m.size() << endl; }下標(biāo)運(yùn)算符為什么要用insert?
因?yàn)槿绻鹝ey不存在的話,返回值就不好返回了,因?yàn)槿绻鹝ey存在返回存在的,如果key不存在插入key和一個(gè)默認(rèn)的value
key是有序的,但是value就不一定
其余的功能演示參考:map的其他功能演示
set
set相關(guān)接口的演示
set容器沒有下標(biāo)預(yù)算符.
set:key,key一定是唯一的
set 最主要的功能是去重,并排序
測試set
int main() {int array[] = { 3, 1, 3, 4, 5, 6, 7, 8, 9, 0, 9, 4, 0, 7, 6, 2, 5, 8 };set<int>s;for (auto e : array)s.insert(e);cout << s.size() << endl;for (auto e : s)cout << e << " ";cout << endl;system("pause");return 0; }multimap
multimap基本操作
注意事項(xiàng)
#include #include
void TestMultimap1() {multimap<string, string> m; m.insert(make_pair("李逵", "黑旋風(fēng)")); m.insert(make_pair("林沖", "豹子頭")); m.insert(make_pair("魯達(dá)", "花和尚"));// 嘗試插入key相同的元素 m.insert(make_pair("李逵", "鐵牛")); cout << m.size() << endl;for (auto& e : m) cout << "<" << e.first << "," << e.second << ">" << endl;// key為李逵的元素有多少個(gè) cout << m.count("李逵") << endl; return 0; } void TestMultimap2() { multimap<int, int> m;for (int i = 0; i < 10; ++i) m.insert(pair<int, int>(i, i));for (auto& e : m) cout << e.first << "--->" << e.second << endl; cout << endl;// 返回m中大于等于5的第一個(gè)元素 auto it = m.lower_bound(5); cout << it->first << "--->" << it->second << endl;// 返回m中大于5的元素 it = m.upper_bound(5); cout << it->first << "--->" << it->second << endl;}multiset
multiset的基本操作
multiset:只存儲(chǔ)key,key可以重復(fù),關(guān)于key有序
測試
int main() {int array[] = { 3, 1, 3, 4, 5, 6, 7, 8, 9, 0, 9, 4, 0, 7, 6, 2, 5, 8 };multiset<int>s;for (auto e : array)s.insert(e);cout << s.size() << endl;for (auto e : s)cout << e << " ";cout << endl;system("pause");return 0; }底層結(jié)構(gòu)及其模擬實(shí)現(xiàn)
底層原理及其模擬實(shí)現(xiàn)
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的关联式容器(map,set,multimap,multiset)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dnf奇遇任务卡片箱在哪得
- 下一篇: 详解 二叉搜索树-----AVL树