关联式容器(map,set,multimap,multiset)
生活随笔
收集整理的這篇文章主要介紹了
关联式容器(map,set,multimap,multiset)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
關聯式概念
- STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,這 些容器統稱為序列式容器,因為其底層為線性序列的數據結構,里面存儲的是元素本身。
- 關聯式容器也是用來存儲數據的,與序列式容器不同的是,其里面存儲的是<key, value>結構的鍵值對,在數據檢索時比序列式容器效率更高。
二叉搜索平衡結構:
關于key有序的序列,時間復雜度O(logN)
- map<key,value> 要求:key一定不能重復
- set:key 要求:key一定不可以重復
- multimap:<key,value> key是可以重復的
- multiset:key,key可以重復
鍵值對
用來表示具有一一對應關系的一種結構,該結構中一般只包含兩個成員變量key和value,key代表鍵值, value表示與key對應的信息。比如:現在要建立一個英漢互譯的字典,那該字典中必然有英文單詞與其對應 的中文含義,而且,英文單詞與其中文含義是一一對應的關系,即通過該應該單詞,在詞典中就可以找到與 其對應的中文含義
SGI—STL中鍵值對的底層實現
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插入數據有兩種方式
還可以通過下標運算符[]
對于map來說,如果我們提供的key不存在的情況下,他就會插入這個數據
因為它的下標運算符的底層是這樣實現的
如果key已經存在了,他就不會插入
void TestMap() {map<string, string>m;m.insert(pair<string,string>("宋江","及時雨"));m.insert(pair<string, string>("李逵", "黑旋風"));//pair<iterator,bool>//iterator:代表map中的一個key-value的鍵值對//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 已經存在不會插入cout << (*ret.first).first << "--->" << ret.first->second << endl;cout << m.size() << endl;cout << m["李逵"] << endl; //把value返回來//用戶提供key---->[]返回key所對應的valuem["李逵"] = "鐵牛"; //修改valuecout << m["李逵"] << endl;m["林沖"] = "豹子頭";cout << m.size() << endl; }下標運算符為什么要用insert?
因為如果key不存在的話,返回值就不好返回了,因為如果key存在返回存在的,如果key不存在插入key和一個默認的value
key是有序的,但是value就不一定
其余的功能演示參考:map的其他功能演示
set
set相關接口的演示
set容器沒有下標預算符.
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基本操作
注意事項
#include #include
void TestMultimap1() {multimap<string, string> m; m.insert(make_pair("李逵", "黑旋風")); m.insert(make_pair("林沖", "豹子頭")); m.insert(make_pair("魯達", "花和尚"));// 嘗試插入key相同的元素 m.insert(make_pair("李逵", "鐵牛")); cout << m.size() << endl;for (auto& e : m) cout << "<" << e.first << "," << e.second << ">" << endl;// key為李逵的元素有多少個 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的第一個元素 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:只存儲key,key可以重復,關于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; }底層結構及其模擬實現
底層原理及其模擬實現
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的关联式容器(map,set,multimap,multiset)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dnf奇遇任务卡片箱在哪得
- 下一篇: 详解 二叉搜索树-----AVL树