STL(set)详细

本文详细介绍了C++标准库中的set容器,包括其特点、基本操作及使用方法。讲解了如何利用set实现数据去重与排序,展示了插入、查找、删除等常用操作,并通过实例演示了自定义比较函数的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)set
特点
1.set作为一个容器是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据;
2.在set中每个元素的值都是唯一;
(所以他可以去重)
3.而且系统能根据元素的值自动进行排序;
用法
begin() 返回set容器第一个元素的迭代器
end() 返回一个指向当前set末尾元素的下一位置的迭代器
clear() 删除set容器中的所有元素
empty() 判断set容器是否为空
max_size() 返回set容器可能包含的元素的最大个数
size() 返回当前set容器中元素个数
erase() 删除特定的值
//后面会详细说的
#include <set>调用

#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
using namespace std;

int main()
{
    set<int>s;//定义
    s.insert(1);//插入
    s.insert(2);
    s.insert(3);
    s.insert(1);
    cout<<"set的size值为:"<<s.size()<<endl;
    cout<<"set的maxsize的值为:"<<s.max_size()<<endl;
    cout<<"set中的第一个元素是:"<<*s.begin()<<endl;
    cout<<"set中的最后一个元素是:"<<*s.end()<<endl;
    s.clear();//清空容器
    if(s.empty())
    {
     cout<<"set 为空 !!!"<<endl;   
    }
    cout<<"set 的 size 值为 :"<<s.size()<<endl;
    cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;
    return 0;
}

在这里插入图片描述

#include<stdio.h>  
#include<set>  
using namespace std;  
int main()  
{  
    set<int>s;  
    s.insert(3);   
    s.insert(1);  
    s.insert(2);  
    s.insert(1);  
    set<int>::iterator it;  //声明        
    for(it=s.begin();it!=s.end();it++)  //使用迭代器进行遍历   
    {  
        printf("%d\n",*it);  
    }  
    return 0;  
}  

在这里插入图片描述
//set的两个特点有序和不重复
count()用来查找set中某个键值出现的次数,这个函数在set中不是很实用,因为一个键值在set中只可能出现0次或1次,这样就变成了判断某一键值是否在set中出现过了。

#include <iostream>
#include <set>
 
using namespace std;
int main(){
     set<int> s;
     s.insert(1);
     s.insert(2);
     s.insert(3);
     s.insert(1);
     cout<<"set 中 1 出现的次数是 :"<<s.count(1)<<endl;
     cout<<"set 中 4 出现的次数是 :"<<s.count(4)<<endl;
     return 0;
}

在这里插入图片描述
erase(iterator) 删除定位器iterator指向的值
erase(first,second) 删除定位器first和second之间的值
erase(key_value) 删除键值key_value的值

#include <iostream>
#include <set>
using namespace std;
int main()
{
     set<int> s;
     set<int>::iterator iter;
     set<int>::iterator first;
     set<int>::iterator second;
     for(int i = 1 ; i <= 10 ; ++i)
     s.insert(i);
     s.erase(s.begin());//第一种删除
     first = s.begin();
     second = s.begin();
     second++;
     second++;
     s.erase(first,second);//第二种删除
     s.erase(8);//第三种删除
     cout<<"删除后 set 中元素是 :";
     for(iter = s.begin() ; iter != s.end() ; ++iter)
         cout<<*iter<<" ";
     cout<<endl;
     return 0;
}

在这里插入图片描述
find() 返回给定值,值的定位器,如果没有找到则返回end()

#include <iostream>
#include <set>
using namespace std;
int main()
{
    int a[]={1,2,3};
    set <int> s(a,a+3);
    set <int> ::iterator iter;
    if((iter=s.find(3))!=s.end())
    {
        cout<<*iter<<endl;
    }
     return 0;
}

在这里插入图片描述
insert(key_value); 将key_value插入到set中
insert(first,second); 将定位器first到second之间的元素插入到set中

#include <iostream>
#include <set>
using namespace std;
int main()
{
     int a[]={1,2,3};
     set<int>s;
     set<int>::iterator iter;
     s.insert(a,a+3);
     for(iter=s.begin();iter!=s.end();++iter)
     cout<<*iter<<" ";
     cout<<endl;
     s.insert(5);
      for(iter=s.begin();iter!=s.end();++iter)
     cout<<*iter<<" ";
     return 0;
}

在这里插入图片描述
lower_bound(key_value) 返回第一个大于等于key_value的定位器
upper_bound(key_value) 返回最后一个大于等于key_value的定位器
//在不存在的情况下返回容器的end()

#include <iostream>
#include <set>
using namespace std;
int main()
{
     set<int> s;
     s.insert(1);
     s.insert(3);
     s.insert(4);
     cout<<*s.lower_bound(2)<<endl;
     cout<<*s.lower_bound(3)<<endl;
     cout<<*s.upper_bound(3)<<endl;
     return 0;
}

在这里插入图片描述
自定义比较函数
//从ppt上弄过来的
例子:
第一个模版:

struct People
{
	string name;
	int age;
	bool operator <(const People p) const  //运算符重载 
	{
		return age<p.age;       //按照年龄由小到大进行排序 
	}
}; 

第二个模版

struct People
{
	string name;
	int age;
	friend bool operator <(People p,People q)  //运算符重载
	{
		return p.age<q.age;       //按照年龄由小到大进行排序
	}
};

要一个完整代码

#include <iostream>
#include <cstdio>

#include <set>
using namespace std;
struct People
{
	string name;
	int age;
	friend bool operator <(People p,People q)  //运算符重载
	{
		return p.age<q.age;       //按照年龄由小到大进行排序
	}
};
int main()
{
    set<People>s;
    s.insert((People){"张颜齐",21});
    s.insert((People){"周震南",19});
    s.insert((People){"王嘉尔",25});
    set<People>::iterator it;
    for(it=s.begin();it!=s.end();it++)  //使用迭代器进行遍历
    {
        printf("姓名:%s 年龄:%d\n",(*it).name.c_str(),(*it).age);
    }
    return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值