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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++中的set容器和multiset容器

發(fā)布時間:2023/11/30 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++中的set容器和multiset容器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

set容器基本概念

  • set的特性是,所有元素都會根據(jù)元素的鍵值自動被排序。set的元素不像map那樣可以同時擁有實值和鍵值,set的元素即是鍵值又是實值。set不允許兩個元素又相同的鍵值。
  • 我們不可以通過set的迭代器改變set元素的值,因為set元素值就是其鍵值,關系到set元素的排序規(guī)則。如果任意改變set元素值,會嚴重破壞set組織。換句話說,set的iterato是一種const_iterator
  • set擁有和list某些相同的性質,當對容器中的元素進行插入操作或者是拿出操作或者刪除操作的時候,操作之前所有的迭代器,在操作完成之后依然有效,被刪除的那個元素的迭代器是一個例外
  • multiset容器的基本概念

    multiset特性及用法和set完全相同,唯一的差別在于它允許鍵值重復,set和multiset的底層實現(xiàn)是紅黑樹,紅黑樹為平衡二叉樹的一種

    紅黑樹:一個結點的左邊全部小于它,它的右邊全部大于它

    set/multiset 對象的默認構造

  • setsetInt; //一個存放 int 的 set 容器。
  • setsetFloat; //一個存放 float 的 set 容器。
  • setsetString; //一個存放 string 的 set 容器。
  • multisetmulsetInt; //一個存放 int 的 multiset 容器。
  • multisetmultisetFloat; //一個存放 float 的 multiset 容器。
  • multisetmultisetString; //一個存放 string 的 multiset 容器。
  • set 的插入與迭代器

  • set.insert(elem); //在容器中插入元素。

  • set.begin(); //返回容器中第一個數(shù)據(jù)的迭代器。

  • set.end(); //返回容器中最后一個數(shù)據(jù)之后的迭代器。

  • set.rbegin(); //返回容器中倒數(shù)第一個元素的迭代器。

  • set.rend(); //返回容器中倒數(shù)最后一個元素的后面的迭代器。

    //set容器不允許插入重復的鍵值 void test03() {set<int>s1;pair<set<int>::iterator,bool>ret=s1.insert(10);if (ret.second == true){cout << "插入成功" << endl;}else{cout << "插入失敗" << endl;}ret=s1.insert(10);if (ret.second == true){cout << "第二次插入成功" << endl;}else{cout << "第二次插入失敗" << endl;}printSet(s1); }
  • Set 集合的元素排序

  • set<int,less> setIntA; //該容器是按升序方式排列元素。

  • set<int,greater>setIntB; //該容器是按降序方式排列元素。

  • set 相當于 set<int,less>。

  • less與 greater中的 int 可以改成其它類型,該類型主要要跟 set 容納的數(shù)據(jù) 類型一致。

    //指定set排序規(guī)則從大到小 //仿函數(shù) //函數(shù)不能做類型,class可以做類型 class myCompare { public://重載()bool operator()(int v1, int v2){return v1 > v2;} };//set容器排序 void test04() {//set<int>s1;set<int, myCompare>s1;s1.insert(5);s1.insert(1);s1.insert(9);s1.insert(3);s1.insert(7);//從大到小排序//在插入之前就指定排序規(guī)則for (set<int, myCompare>::iterator it = s1.begin(); it != s1.end(); it++){cout << *it << " ";}cout << endl;}
  • set 對象的拷貝構造與賦值

  • set(constset&st); //拷貝構造函數(shù)

  • set&operator=(constset&st); //重載等號操作符 set.swap(st); //交換兩個集合容器

  • set 的大小操作

  • set.size(); //返回容器中元素的數(shù)目
  • set.empty();//判斷容器是否為空
  • set 的刪除操作

  • set.clear(); //清除所有元素
  • set.erase(pos); //刪除 pos 迭代器所指的元素,返回下一個元素的迭代器。
  • set.erase(beg,end); //刪除區(qū)間[beg,end)的所有元素 ,返回下一個元素的迭代器。
  • set.erase(elem); //刪除容器中值為 elem 的元素。
  • set 的查找操作

  • set.find(elem); //查找 elem 元素,返回指向 elem 元素的迭代器。

  • set.count(elem); //返回容器中值為 elem 的元素個數(shù)。對 set 來說,要么是 0,要 么是 1。對 multiset 來說,值可能大于 1。

  • set.lower_bound(elem); //返回第一個>=elem 元素的迭代器

  • set.upper_bound(elem); // 返回第一個>elem 元素的迭代器。

  • set.equal_range(elem); //返回容器中與 elem 相等的上下限的兩個迭代器。上 限是閉區(qū)間,下限是開區(qū)間,如[beg,end)。

    void test02(){set<int>s1;s1.insert(5);s1.insert(1);s1.insert(9);s1.insert(3);s1.insert(7);//對于set 沒有value key就是valueset<int>::iterator pos=s1.find(2);//判斷是否找到if (pos != s1.end()){cout << "找到了,值為:" << *pos << endl;}else{cout << "未找到" << endl;}//count(key)//查找鍵值key的元素的個數(shù) set而言結果是0或者1int num = s1.count(2);cout << "2的個數(shù)為:" << num << endl;//lower_bound(keyElem);//返回第一個key=keyElem元素的迭代器set<int>::iterator it=s1.lower_bound(10);if (it != s1.end()){cout << "找到了,值為" << *it << endl;}else{cout << "未找到" << endl;}//upper_bound(keyElem);//返回第一個key>keyElem元素的迭代器,set<int>::iterator it2 = s1.upper_bound(3);//第一個大于3的值if (it2 != s1.end()){cout << "找到了,值為" << *it2 << endl;//5}else{cout << "未找到" << endl;}//equal_range(keyElem);//返回容器中key與keyElem相等的上下限的兩個迭代器//上下限 就是lower_bound和upper_boundpair <set<int>::iterator, set<int> ::iterator> ret = s1.equal_range(3);//獲取第一個值if (ret.first != s1.end()){cout << "找到equal_range中的lower_bound的值:" << *(ret.first) << endl;}else{cout << "未找到" << endl;}//獲取第二個值if (ret.second != s1.end()){cout << "找到equal_range中的equal_range的值:" << *(ret.second) << endl;}else{cout << "未找到" << endl;}}
  • 注意:
    1 關聯(lián)式容器
    2 插入數(shù)據(jù)自動排序
    3 insert插入值
    4 erase參數(shù)可以傳值或者迭代器

    #include<iostream>using namespace std;#include<set>void printSet(set<int>&s){for (set<int>::iterator it = s.begin(); it != s.end(); it++){cout << *it << " ";}cout << endl;}void test01(){set<int>s1;//關聯(lián)式容器 key進行排序,從小到大自動排序s1.insert(5);s1.insert(1);s1.insert(9);s1.insert(3);s1.insert(7);printSet(s1);if (s1.empty()){cout << "空" << endl;}else{cout << "size=" << s1.size() << endl;}s1.erase(s1.begin());//3 5 7 9printSet(s1);s1.erase(3);// 5 7 9printSet(s1);}int main(){test01();system("pause");return 0;}

    pair 的使用

  • pair 譯為對組,可以將兩個值視為一個單元。

  • pair<T1,T2>存放的兩個值的類型,可以不一樣,如 T1 為 int,T2 為 float。T1,T2 也可 以是自定義類型。

  • pair.first 是 pair 里面的第一個值,是 T1 類型。

  • pair.second 是 pair 里面的第二個值,是 T2 類型。

    #include<iostream>using namespace std; #include<string>void test01() {//第一種pair<string, int>p(string("Tom"), 100);//取值cout << "姓名:" << p.first << endl;cout << "年齡:" << p.second << endl;//第二種創(chuàng)建方式pair<string, int>p2 = make_pair("Jerry", 200);cout << "姓名:" << p.first << endl;cout << "年齡:" << p.second << endl; }int main() {test01();system("pause");return 0; }
  • set容器中插入自定義數(shù)據(jù)類型

    //自定義數(shù)據(jù)類型class Person{public:Person(string name, int age){this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;};class myComparePerson{public:bool operator()(const Person&p1, const Person&p2){if (p1.m_Age > p2.m_Age)//降序{return true;}return false;}};void test05(){set<Person,myComparePerson>s1;Person p1("大娃", 100);Person p2("二娃", 90);Person p3("六娃", 10);Person p4("爺爺", 1000);s1.insert(p1);s1.insert(p2);s1.insert(p3);s1.insert(p4);//插入自定義數(shù)據(jù)類型,一開始必須指定排序規(guī)則//顯示for (set<Person, myComparePerson>::iterator it = s1.begin(); it != s1.end(); it++){cout << "姓名:" << (*it).m_Name << "年齡" << (*it).m_Age << endl;}}int main(){//test01();//test02();//test03();//test04();test05();system("pause");return 0;}

    總結

    以上是生活随笔為你收集整理的c++中的set容器和multiset容器的全部內容,希望文章能夠幫你解決所遇到的問題。

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