#include <bits/stdc++.h>
using namespace std;
int main(){
//1.set是集合容器,其包含元素是唯一的,且元素按照一定顺序排列(默认升序)
//2.由于插入元素的规则按照排序规则插入,所以各个元素位置都可能发生变化,所以不能按照下标位置查找,比如[]和at()
//容器构造以及初始化
set<int> set1 = {1,8,3,5,4,5};
//使用迭代器遍历set并输出元素,集合可过滤重复元素,同时默认升序排列
for (set<int>::iterator it = set1.begin(); it != set1.end(); ++it) {
cout << *it << " ";
}
//反向迭代器为rbegin和rend
cout << endl;
//拷贝构造
set<int> set2(set1);
//用auto遍历输出
for (const auto& elem : set2) {
cout << elem << ' ';
}
cout << endl;
//集合交换
set<int> set3 = {1,2,3};
set<int> set4 = {1,2,3,4};
set3.swap(set4);
for (const auto& elem : set3) {
cout << elem << ' ';
}
cout<<endl;
for (const auto& elem : set4) {
cout << elem << ' ';
}
cout<<endl;
//set容器大小
set<int> set5={3,2,1,0};
cout<<set5.size()<<' ';//返回容器大小
cout<<set5.empty()<<endl;//容器为空则返回1,否则为0
//set插入
set<int> set6;
set6.insert(1); //插入后自动排序,所以没有指定位置插入
set6.insert(4);
set6.insert(7);
set6.insert(8);
set6.insert(9);
set6.insert(10);
//find函数查找某元素是否存在,存在则返回指向那个元素的迭代器,否则指向end
auto it6 = set6.find(4);
if(it6!=set6.end()) cout<<"4在set6里面"<<endl;
cout<<"10是否存在:"<<set6.count(10)<<endl;//count统计某元素出现的数量,由于集合元素不可重复,count相当于检查该元素是否存在集合中
//set容器的删除
//删除迭代器指向的元素
set6.erase(it6);//当前迭代器it在指向元素4的地方
for(auto s:set6)cout<<s<<' '; //1,4,7,8,9,10删除了4
//删除具体的值
cout<<endl;
set6.erase(1);
for(auto s:set6)cout<<s<<' ';
//清空元素
//删除某区间的所有值
set6.clear();
for(auto s:set6)cout<<s<<' ';
cout<<endl;
//set降序排序
set<int,greater<int>> set7={1,2,3,4,5,6,7,8};
for(auto s:set7)cout<<s<<' ';
cout<<endl;
auto it_low = set7.lower_bound(5);
auto it_upper = set7.upper_bound(5);
cout<<*it_low<<endl;//返回第一个大于等于5的元素
cout<<*it_upper<<endl;//返回第一个大于5的元素
//3.multiset与set的区别,multiset的元素可重复
multiset<int> mul_set1 = {1,2,2,2,1,2};
for(auto m_s:mul_set1)cout<<m_s<<' ';
cout<<endl;
//删除所有指定的元素
mul_set1.erase(1);
for(auto s:mul_set1)cout<<s<<' ';
cout<<endl;
//统计某元素出现的次数
int num_mul_set1 = mul_set1.count(2);
cout<<num_mul_set1;
//4.unordered_set是元素唯一但不进行排序的容器。
unordered_set<int> unorder;
unorder.insert(1); //前插法插入元素到容器中
unorder.insert(7);
unorder.insert(5);
unorder.insert(1);
unorder.insert(1);
unorder.insert(5);
for(auto u:unorder)cout<<u<<' ';
cout<<endl;
return 0;
}