新建set
set<int> s;
set<int>::iterator it; //用于查找、删除、正向遍历等
set<int>::reverse_iterator rit; //用于逆向遍历
插入数据
//方式1单个插入
s.insert(4);
//方式2数组形式插入
int arr[] {1,2,3};
s.insert(begin(arr),end(arr));
删除数据
//方式1直接通过key值删除
s.erase(4);
//方式2通过迭代器删除
it=s.find(2);
s.erase(it);
修改数据
修改数据,需要先删除原数据再插入新数据
查找数据
it=s.find(1);
if(it==s.end()) cout<<"not found"<<endl;
else cout<<"找到元素:"<<*it<<endl;
遍历set
//正向遍历
for(it=s.begin();it!=s.end();it++)
cout<<*it<<endl;
//逆向遍历
for(rit=s.rbegin();rit!=s.rend();rit++)
cout<<*rit<<endl;
获取set大小
s.size();
set的排序问题
set的排序问题,默认从小到大排序,类似于map可以在结构体内重载小于操作符或重载sort类的函数,详见https://blog.csdn.net/qq_43270828/article/details/105900609
自定义结构体排序例子
测试程序:代表学生的结构体有两个成员变量id与name都是字符串类型,加入map时的排序逻辑为名字在字典中较大的排在前面,如果名字相同则比较id,id较小的排在前面
#include <iostream>
#include <set>
using namespace std;
typedef struct stu{
string id;
string name;
//形参一定是常量引用类型,后面方法括号后面一定要有const重载符
bool operator < (stu const& other) const{
if(name==other.name)
return id<other.id;
else
return name>other.name;
}
}stu;
int main(){
set<stu> s;
set<stu>::iterator it; //用于查找、删除、正向遍历等
stu arr[3];
arr[0].id="zc001";
arr[1].id="zc002";
arr[2].id="zc003";
arr[0].name="name1";
arr[1].name="name3";
arr[2].name="name1";
s.insert(begin(arr),end(arr));
for(it=s.begin();it!=s.end();it++)
cout<<it->id<<it->name<<endl;
return 0;
}
结果:
zc002 name3
zc001 name1
zc003 name1
其他操作
//判断set是否为空
s.empty();
//set清空
s.clear();
总代码
#include <iostream>
#include <set>
using namespace std;
int main(){
//新建set
set<int> s;
set<int>::iterator it; //用于查找、删除、正向遍历等
set<int>::reverse_iterator rit; //用于逆向遍历
//插入数据
//方式1单个插入
s.insert(4);
//方式2数组形式插入
int arr[] {1,2,3};
s.insert(begin(arr),end(arr));
//删除数据
//方式1直接通过key值删除
s.erase(4);
//方式2通过迭代器删除
it=s.find(2);
s.erase(it);
//查找数据
it=s.find(1);
if(it==s.end()) cout<<"not found"<<endl;
else cout<<"找到元素:"<<*it<<endl;
//遍历set
//正向遍历
for(it=s.begin();it!=s.end();it++)
cout<<*it<<endl;
//逆向遍历
for(rit=s.rbegin();rit!=s.rend();rit++)
cout<<*rit<<endl;
//获取set大小
s.size();
return 0;
}