C++ Set(集合)

简介

  • set 是一个内部自动有序且不含重复元素的容器。
  • set 最主要的作用就是自动去重并按升序排序,适用于需要去重但是又不方便直接开数组的情况。
  • set 中的元素是唯一的,其内部采用“红黑树”实现。

注:本文章只列举 set 在 ACM 中的常见操作,如需了解更多有关 set 内容,请参考 C++官方文档

Set 的基本用法

头文件 #include <set>
需要使用 std 命名空间 using namespace std;

作用 方法 说明
定义 set set<type> s; type 可以是任何基本类型或者容器
插入元素 s.insert(x) 将元素插入到集合中
删除元素 s.erase(x) 移除元素
查找元素 s.count(x) 判断集合中是否存在该元素
获取元素个数 s.size() 不会删除队尾元素
清空集合 s.clear() 删除集合中所有元素

删除元素及注意事项

//删除迭代器器iterator指向的元素
erase(iterator);

//删除迭代器first和second之间的元素
erase(first,second);

//删除元素x
erase(x);

注意:在迭代器遍历时删除元素会使当前迭代器失效!
下面举例说明: ヾ(•ω•`)o

//错误用法:
for(set<int>::iterator it=s.begin();it!=s.end();it++)
{
	if(someConditions)s.erase(it);
}

//正确删除方法一:
for(set<int>::iterator it=s.begin();it!=s.end();)
{
	if(someConditions)s.erase(it++);
	else it++;
}

//正确删除方法二:
for(set<int>::iterator it=s.begin();it!=s.end();)
{
	if(someConditions)it=s.erase(it);
	else it++;
}

二分查找

由于 set 内部元素是有序的,因此可以进行二分查找。

  • lower_bound(key_value) 返回第一个大于等于key_value的迭代器
  • upper_bound(key_value) 返回最后一个大于等于key_value的迭代器

迭代器类型及用法

set只能通过迭代器遍历,即遍历set集合前需先定义一个迭代器:set<type>::iterator it; 然后使用 *it 访问set中的元素。

//循环输出set集合中的元素
for(set<int>::iterator it=s.begin();it!=s.end();it++)
{
	cout<<*it<<endl;
}

其他类型迭代器:

  • s.begin()s.end() 返回 iterator 类型的迭代器。
  • s.rbegin()s.rend() 返回 reverse_iterator 类型的迭代器。
  • s.cbegin()s.cend() 返回 const_iterator 类型的迭代器。
  • s.crbegin()s.crend() 返回 const_reverse_iterator 类型的迭代器。

注:后两种迭代器仅在 C++11 以后的标准中可用。

这些迭代器的用法都很相似:

//正常迭代器
for(set<int>::iterator it=s.begin();it!=s.end();it++) cout<<*it<<endl;
//反向迭代器
for(set<int>::reverse_iterator it=s.begin();it!=s.end();it++) cout<<*it<<endl;
//常量迭代器(只能访问,不可修改)
for(set<int>::const_iterator it=s.begin();it!=s.end();it++) cout<<*it<<endl;
//反向常量迭代器
for(set<int>::const_reverse_iterator it=s.begin();it!=s.end();it++) cout<<*it<<endl;

相关习题详见: NEFU 大一寒假训练十二(set)2020.02.18

发布了66 篇原创文章 · 获赞 218 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/csg999/article/details/104390970