日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关联式容器(map,set,multimap,multiset)

發布時間:2023/11/30 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关联式容器(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是關聯容器,它按照特定的次序(按照key來比較)存儲由鍵值key和值value組合而成的元素。
  • 在map中,鍵值key通常用于排序和惟一地標識元素,而值value中存儲與此鍵值key關聯的內容。鍵值 key和值value的類型可能不同,并且在map的內部,key與value通過成員類型value_type綁定在一起, 為其取別名稱為pair: typedef pair value_type;
  • 在內部,map中的元素總是按照鍵值key進行比較排序的。
  • map中通過鍵值訪問單個元素的速度通常比unordered_map容器慢,但map允許根據順序對元素進行 直接迭代(即對map中的元素進行迭代時,可以得到一個有序的序列)。
  • map支持下標訪問符,即在[]中放入key,就可以找到與key對應的value。
  • map通常被實現為二叉搜索樹(更準確的說:平衡二叉搜索樹(紅黑樹))。
  • map::insert()


    通過insert插入數據有兩種方式

  • pair<類型,類型>(數據,數據)
  • make_pair(數據,數據)
  • 還可以通過下標運算符[]
    對于map來說,如果我們提供的key不存在的情況下,他就會插入這個數據
    因為它的下標運算符的底層是這樣實現的

    (*((this->insert(make_pair(k,mapped_type()))).first)).second

    如果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

    void TestMap2() {int array[] = { 3, 1, 9, 4, 0, 7, 6, 2, 5 };map<int, int>m;for (auto e : array){m.insert(make_pair(e, e));}//測試按照迭代器方式進行遍歷,能否得到一個關于key有序的序列auto it = m.begin();while (it != m.end()){cout << it->first << "---->" << it->second << endl;++it;}cout << endl;for (auto& e : m){cout << e.first << "---->" << e.second << endl;}cout << endl; }

    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基本操作

    注意事項

  • multimap中的key是可以重復的。
  • multimap中的元素默認將key按照小于來比較
  • multimap中沒有重載operator[]操作
  • 使用時與map包含的頭文件相同
  • #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)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。