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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/11/30 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关联式容器(map,set,multimap,multiset) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

關(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是關(guān)聯(lián)容器,它按照特定的次序(按照key來比較)存儲(chǔ)由鍵值key和值value組合而成的元素。
  • 在map中,鍵值key通常用于排序和惟一地標(biāo)識(shí)元素,而值value中存儲(chǔ)與此鍵值key關(guān)聯(lián)的內(nèi)容。鍵值 key和值value的類型可能不同,并且在map的內(nèi)部,key與value通過成員類型value_type綁定在一起, 為其取別名稱為pair: typedef pair value_type;
  • 在內(nèi)部,map中的元素總是按照鍵值key進(jìn)行比較排序的。
  • map中通過鍵值訪問單個(gè)元素的速度通常比unordered_map容器慢,但map允許根據(jù)順序?qū)υ剡M(jìn)行 直接迭代(即對(duì)map中的元素進(jìn)行迭代時(shí),可以得到一個(gè)有序的序列)。
  • map支持下標(biāo)訪問符,即在[]中放入key,就可以找到與key對(duì)應(yīng)的value。
  • map通常被實(shí)現(xiàn)為二叉搜索樹(更準(zhǔn)確的說:平衡二叉搜索樹(紅黑樹))。
  • map::insert()


    通過insert插入數(shù)據(jù)有兩種方式

  • pair<類型,類型>(數(shù)據(jù),數(shù)據(jù))
  • make_pair(數(shù)據(jù),數(shù)據(jù))
  • 還可以通過下標(biāo)運(yùn)算符[]
    對(duì)于map來說,如果我們提供的key不存在的情況下,他就會(huì)插入這個(gè)數(shù)據(jù)
    因?yàn)樗南聵?biāo)運(yùn)算符的底層是這樣實(shí)現(xiàn)的

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

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

    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));}//測試按照迭代器方式進(jìn)行遍歷,能否得到一個(gè)關(guān)于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相關(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)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。