STL关于set的一些笔记

在这里插入图片描述
重点:
头文件#include<set>
1、set中的元素都是排好序的
2、set集合中没有重复的元素

c++ stl集合(Set)是一种包含已排序对象的关联容器。set/multiset会根据待定的排序准则,自动将元素排序。两者不同在于前者不允许元素重复,而后者允许。

注意:
不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,再插入新元素

不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取,而且从迭代器角度来看,元素值是常数

元素比较动作只能用于型别相同的容器(即元素和排序准则必须相同)

1.定义set:

set<int>name;
set<double>name;
set<char>name;
set<node>name;//node是结构体类型
set<int>a[100];//数组类型

自定义比较函数
(1)元素不是结构体:
自定义比较函数myComp,重载“()”操作符

struct myComp
{
	bool operator()(const your_type &a, const your_type &b){
		return a.data - b.data > 0;
	}
}
set<int, myComp>s;
set<int, myComp>::iterator it; erator it;

(2)如果元素是结构体,可以直接将比较函数写在结构体内。

struct Info
{
	string name;
	float score;
	 //重载“<”操作符,自定义排序规则
	bool operator < (const Info &a) const{
		 //按score从大到小排列
		 return a.score<score;
 	}
}
set<Info> s;
set::iterator it;

2.set容器内元素的访问

与vector不同,set只能通过迭代器(iterator)访问,并用*it来访问其中的元素例如:

set<int>::iterator it;
set<char>::iterator it;

由于除开vector和string之外的STL容器都不支持*(it +i)的访问方式,因此只能按如下方式枚举

set<int>st;
for(set<int>::iterator it = st.begin();it != st.end();it++)
	printf("%d",*it);

3.set常用函数实例解析

begin()        
返回set容器的第一个迭代器
end()      
返回set容器的最后一个迭代器
rbegin()     
返回的值和end()相同
rend()     
返回的值和rbegin()相同

insert()
insert(x)可将x插入set容器中,并自动递增排序和去重
返回值是pair<set<int>::iterator,bool>bool标志着插入是否成功,而iterator代表插入的位置,若key_value已经在set中,则iterator表示的key_value在set中的位置。

inset(first,second);将定位器first到second之间的元素插入到set中,返回值是void.
	int a[] = {1,2,3};  
    set<int> s;  
    set<int>::iterator iter;  
    s.insert(a,a+3); 

find()
find(value)返回set对应值为value的迭代器,没找到返回end();
count() 
用来查找set中某个某个键值出现的次数。这个函数在set并不是很实用,
因为一个键值在set只可能出现01次,这样就变成了判断某一键值是否在set出现过了。

equal_range()  
返回一对定位器,分别表示第一个大于或等于给定关键值的元素和 第一个大于给定关键值的元素,
这个返回值是一个pair类型,如果这一对定位器中哪个返回失败,就会等于end()的值。

lower_bound(key_value) 
返回第一个大于等于key_value的定位器
upper_bound(key_value)
返回第一个一个大于key_value的定位器

erase()
	一种删除方法是erase(it),里面为迭代器,另一种是erase(value),里面放的是值。还可以删除区间内的元素,如st.erase(first,second);
	//第一种删除  
    s.erase(s.begin());  
    //第二种删除  
    first = s.begin();  
    second = s.begin();  
    second++;  
    second++;  
    s.erase(first,second);  
    //第三种删除  
    s.erase(8);  

size()
用于获取set内元素的个数
max_size()   
返回set容器可能包含的元素最大个数

clear()
清空set中的元素

empty()    
判断set容器是否为空
成员函数作用
begin()返回指向第一个元素的迭代器
clear()清除所有元素
count()返回某个值元素的个数
empty()如果集合为空,返回true
end()返回指向最后一个元素下一个位置的迭代器
equal_range()返回集合中与给定值相等的上下限的两个迭代器
erase()删除集合中的元素
find()返回一个指向被查找到元素的迭代器
get_allocator()返回集合的分配器
insert()在集合中插入元素
lower_bound()返回指向大于(或等于)某值的第一个元素的迭代器
upper_bound()返回大于某个值元素的迭代器
key_comp()返回一个用于元素间值比较的函数
max_size()返回集合能容纳的元素的最大限值
rbegin()返回指向集合中最后一个元素的反向迭代器
rend()返回指向集合中第一个元素的反向迭代器
size()集合中元素的数目
swap()交换两个集合变量
value_comp()返回一个用于比较元素间的值的函数
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值