C++STL——set

7 篇文章 0 订阅


新建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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值