最清晰!最全!C++ STL-set用法#set的各成员函数列表#代码举例

set跟vector差不多,它跟vector的唯一区别就是,set里面的元素是有序的且唯一的,只要你往set里添加元素,它就会自动排序(升序),而且,如果你添加的元素set里面本来就存在,那么这次添加操作就不执行。要想用set先加个头文件set。

set的各成员函数列表如下:

c++ stl容器set成员函数:begin()--返回指向第一个元素的迭代器

c++ stl容器set成员函数:clear()--清除所有元素

c++ stl容器set成员函数:count()--返回某个值元素的个数

c++ stl容器set成员函数:empty()--如果集合为空,返回true

c++ stl容器set成员函数:end()--返回指向最后一个元素的迭代器

c++ stl容器set成员函数:equal_range()--返回集合中与给定值相等的上下限的两个迭代器

c++ stl容器set成员函数:erase()--删除集合中的元素

c++ stl容器set成员函数:find()--返回一个指向被查找到元素的迭代器

c++ stl容器set成员函数:get_allocator()--返回集合的分配器

c++ stl容器set成员函数:insert()--在集合中插入元素

c++ stl容器set成员函数:lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器

c++ stl容器set成员函数:key_comp()--返回一个用于元素间值比较的函数

c++ stl容器set成员函数:max_size()--返回集合能容纳的元素的最大限值

c++ stl容器set成员函数:rbegin()--返回指向集合中最后一个元素的反向迭代器

c++ stl容器set成员函数:rend()--返回指向集合中第一个元素的反向迭代器

c++ stl容器set成员函数:size()--集合中元素的数目

c++ stl容器set成员函数:swap()--交换两个集合变量

c++ stl容器set成员函数:upper_bound()--返回大于某个值元素的迭代器

c++ stl容器set成员函数:value_comp()--返回一个用于比较元素间的值的函数

--------------------------------------------------------------------------------------------------------------------------------

Set是什么?

Set是C++STL中提供的容器,set是数学上的集合——具有唯一性,即每个元素只出现一次,而multiset则是可重集,两者的内部实现是一棵红黑树,它们支持的函数基本相同

Set的相关操作

头文件与声明

像这样:

就像其他需要排序的数据类型一样,为一个结构体的set,需要重载小于号

set.size()

统计set中元素个数,函数返回一个整形变量,表示set中元素个数,时间复杂度O(1)

set.empty()

检查set是否为空,返回一个bool型变量,1表示set为空,否则为非空,时间复杂度O(1)

set.clear()

清空set,无返回值

set.count(x)

返回set或multiset中值为x的元素个数,时间复杂度为O(log n)

迭代器

  • 双向访问迭代器,不支持随机访问,支持星号解除引用,仅支持“++”,“--”这两个算术操作

引用和操作:

若把it++,则it将会指向“下一个”元素。这里的下一个是指在key从小到大排序的结果中,排在it下一名的元素。同理,若把it--,则it会指向排在上一个的元素

“++”,“--”操作的复杂度均为O(log n)

  • 遍历set及访问其中的元素

set.begin()

返回集合的首迭代器,即指向集合中最小元素的迭代器,时间复杂度为O(1)

set.end()

返回集合的尾迭代器,众所周知,STL中区间都是左闭右开的,那么end()函数返回的迭代器即为指向集合中最大元素的下一个位置的迭代器,因此--s.end()才是指向集合中最大元素的迭代器,时间复杂度为O(1)

set.insert(x)

在set中插入元素,返回插入地址的迭代器和是否插入成功的bool并成的pair,时间复杂度为O(log n)

PS:set在进行插入的时候是不允许有重复的键值的,如果新插入的键值与原有的键值重复则插入无效(multiset可以重复)

set.erase(参数)

删除,参数可以是元素或者迭代器,返回下一个元素的迭代器,时间复杂度为O(log n),注意在multiset中s.erase(x)会删除所有值为x的元素

set.find(x)

在set中查找值为x的元素,并返回指向该元素的迭代器,若不存在,返回set.end(),时间复杂度为O(log n)

set.lower_bound(x)/upper_bound(x)

两个神奇的东西,决定把他们放在一块谈一谈

用法与find类似,但查找的条件略有不同,时间复杂度O(log n)

s.lower_bound(x)表示查找>=x的元素中最小的一个,并返回指向该元素的迭代器

s.upper_bound(x)表示查找>x的元素中最小的一个,并返回指向该元素的迭代器

举个例子:

在set{3,5,7,8,13,16}中,

对于在set中存在的元素,比如8,

s.lower_bound(8)返回8所在位置的迭代器。

s.upper_bound(8)返回13所在位置的迭代器。

对于在set中不存在的元素,比如12,

两个函数返回的则都是13所在位置的迭代器。

特殊地,

对于比set中最大的元素大的元素,比如20,

两个函数返回的都是s.end()。

--------------------------------------------------------------------------------------------------------------------------------------------

set<pair<int,int> >的用法

set默认的比较规则先按照first比较,如果first相同,再按照second 比较。 注意:定义的时候右边的两个>>要空一格。

--------------------------------------------------------------------------------------------------------------------------------------------

代码举例

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

int main() {
	set<int> s1;
	//添加
	s1.insert(3);
	s1.insert(3);//集合里已经有了,所以不会添加 
	s1.insert(5);
	s1.insert(7);
	s1.insert(9);
	s1.insert(0);
	s1.insert(12);
	s1.insert(16);
	
	//删除
	s1.erase(3);
	 
	//遍历
	set<int>::iterator it = s1.begin();
	while(it!=s1.end()){
		cout<<*it<<" ";
		it++;
	}
	/*
	遍历的另一种写法
	set<int>::iterator it = s1.begin();
	for(;it!=s1.end();it++) {
		cout<<*it<<" ";
	}
	*/
	
	cout<<"\n";
	
	//查找:使用find()函数可以查找元素是否存在 
    if(s1.find(5)!=s1.end())
    	cout<<"找到了5"<<"\n";
    	
    //使用size()函数可以获得当前元素个数
	 cout<<"当前元素个数为:"<<s1.size()<<"\n";
	 
	return 0;
} 

 

 

  • 14
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏普通

谢谢打赏~普通在此谢过

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值