c++中的set容器和multiset容器
set容器基本概念
multiset容器的基本概念
multiset特性及用法和set完全相同,唯一的差別在于它允許鍵值重復,set和multiset的底層實現是紅黑樹,紅黑樹為平衡二叉樹的一種
紅黑樹:一個結點的左邊全部小于它,它的右邊全部大于它
set/multiset 對象的默認構造
set 的插入與迭代器
set.insert(elem); //在容器中插入元素。
set.begin(); //返回容器中第一個數據的迭代器。
set.end(); //返回容器中最后一個數據之后的迭代器。
set.rbegin(); //返回容器中倒數第一個元素的迭代器。
set.rend(); //返回容器中倒數最后一個元素的后面的迭代器。
//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 容納的數據 類型一致。
//指定set排序規則從大到小 //仿函數 //函數不能做類型,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);//從大到小排序//在插入之前就指定排序規則for (set<int, myCompare>::iterator it = s1.begin(); it != s1.end(); it++){cout << *it << " ";}cout << endl;}set 對象的拷貝構造與賦值
set(constset&st); //拷貝構造函數
set&operator=(constset&st); //重載等號操作符 set.swap(st); //交換兩個集合容器
set 的大小操作
set 的刪除操作
set 的查找操作
set.find(elem); //查找 elem 元素,返回指向 elem 元素的迭代器。
set.count(elem); //返回容器中值為 elem 的元素個數。對 set 來說,要么是 0,要 么是 1。對 multiset 來說,值可能大于 1。
set.lower_bound(elem); //返回第一個>=elem 元素的迭代器
set.upper_bound(elem); // 返回第一個>elem 元素的迭代器。
set.equal_range(elem); //返回容器中與 elem 相等的上下限的兩個迭代器。上 限是閉區間,下限是開區間,如[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的元素的個數 set而言結果是0或者1int num = s1.count(2);cout << "2的個數為:" << 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 關聯式容器
2 插入數據自動排序
3 insert插入值
4 erase參數可以傳值或者迭代器
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;//第二種創建方式pair<string, int>p2 = make_pair("Jerry", 200);cout << "姓名:" << p.first << endl;cout << "年齡:" << p.second << endl; }int main() {test01();system("pause");return 0; }set容器中插入自定義數據類型
//自定義數據類型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);//插入自定義數據類型,一開始必須指定排序規則//顯示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容器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 逆水寒奇遇罗盘功能有什么内容
- 下一篇: 成都大熊猫繁育基地能带食品吗