set/multiset/unordered_set容器
set:所有元素都会在插入时自动被排序
set/multiset属于关联式容器,底层结构是用二叉树实现
set/multiset区别:set不允许容器中有重复的元素;multiset允许容器中有重复的元素
1.构造和赋值
#include <iostream>
#include <string>
#include <set>
using namespace std;
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;
//插入数据 只有insert方式
s1.insert(10);
s1.insert(40);
s1.insert(30);
s1.insert(20);
s1.insert(30);
//遍历容器
//set容器特点:所有元素插入时候自动被排序
//set容器不允许插入重复值
printset(s1);
//拷贝构造
set<int>s2(s1);
printset(s2);
//赋值
set<int>s3;
s3=s2;
printset(s3);
}
int main(){
test01();
}
结果为:
2.set大小和交换
#include <iostream>
#include <string>
#include <set>
using namespace std;
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;
set<int>s2;
s1.insert(30);
s1.insert(10);
s1.insert(40);
s1.insert(20);
s2.insert(100);
s2.insert(50);
printset(s1);
printset(s2);
if(s1.empty())
cout<<"s1 empty"<<endl;
else{
cout<<"s1 no empty"<<endl;
cout<<s1.size()<<endl;
}
s1.swap(s2);
printset(s1);
printset(s2);
}
int main(){
test01();
}
结果为:
3.set插入和删除
#include <iostream>
#include <string>
#include <set>
using namespace std;
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;
s1.insert(30);
s1.insert(10);
s1.insert(40);
s1.insert(20);
printset(s1);
// s1.erase(s1.begin());
// s1.erase(20);
// printset(s1);
//清空
// s1.erase(s1.begin(),s1.end());
// printset(s1);
s1.clear();
printset(s1);
}
int main(){
test01();
}
4.set查找和统计
#include <iostream>
#include <string>
#include <set>
using namespace std;
void test01(){
set<int>s1;
s1.insert(40);
s1.insert(20);
s1.insert(10);
s1.insert(30);
set<int>::iterator pos=s1.find(30);
if(pos!=s1.end())
cout<<"find "<<*pos<<endl;
else
cout<<"miss"<<endl;
}
void test02(){
multiset<int>s1;
s1.insert(30);
s1.insert(30);
s1.insert(40);
s1.insert(20);
s1.insert(10);
s1.insert(30);
int num=s1.count(30);
cout<<num<<endl;
}
int main(){
test02();
}
5.set和multiset的区别
#include <iostream>
#include <string>
#include <set>
using namespace std;
//set插入数据的同时会返回插入结果,表示插入是否成功
//mutliset不会检测数据,因此可以插入重复数据
void test01(){
set<int>s;
pair<set<int>::iterator,bool> ret=s.insert(10);
if(ret.second){
cout<<"successful"<<endl;
}
else
cout<<"failed"<<endl;
ret=s.insert(10);
if(ret.second){
cout<<"successful"<<endl;
}
else
cout<<"failed"<<endl;
multiset<int>ms;
ms.insert(10);
}
int main(){
test01();
}
6.pair对组创建
#include <iostream>
#include <string>
#include <set>
using namespace std;
void test01(){
pair<string,int>p("Tom",20);
cout<<p.first<<p.second<<endl;
pair<string,int>p2=make_pair("Tom",20);
cout<<p2.first<<p2.second<<endl;
}
int main(){
test01();
}
7.set容器排序
set默认为升序,可以改为降序
#include <iostream>
#include <string>
#include <set>
using namespace std;
//利用仿函数,可以改变排序规则
class MyCompare{
public:
bool operator()(int v1,int v2){
return v1>v2;
}
};
void test01(){
set<int>s1;
s1.insert(10);
s1.insert(50);
s1.insert(30);
s1.insert(70);
s1.insert(100);
for(set<int>::iterator it=s1.begin();it!=s1.end();it++){
cout<<(*it)<<" ";
}
cout<<endl;
//指定排序规则为从大到小
set<int,MyCompare>s2;
s2.insert(10);
s2.insert(50);
s2.insert(30);
s2.insert(70);
s2.insert(100);
for(set<int,MyCompare>::iterator it=s2.begin();it!=s2.end();it++){
cout<<*it<<" ";
}
cout<<endl;
}
int main(){
test01();
}
8.对自定义数据类型做排序的时候,需要指定排序规则
#include <iostream>
#include <string>
#include <set>
using namespace std;
class Person{
public:
Person(string name,int age){
this->m_Name=name;
this->m_Age=age;
}
string m_Name;
int m_Age;
};
class ComparePerson{
public:
bool operator()(const Person& p1,const Person& p2){
return p1.m_Age<p2.m_Age;
}
};
void test01(){
//自定义数据类型都会指定排序规则
set<Person,ComparePerson>s;
Person p1("刘备",24);
Person p2("关羽",21);
Person p3("张飞",29);
Person p4("孔明",27);
s.insert(p1);
s.insert(p2);
s.insert(p3);
s.insert(p4);
for(set<Person,ComparePerson>::iterator it=s.begin();it!=s.end();it++){
cout<<it->m_Name<<" "<<it->m_Age<<endl;
}
}
int main(){
test01();
}