C++ Set(集合)
简介set 是一个内部自动有序且不含重复元素的容器。set 最主要的作用就是自动去重并按升序排序,适用于需要去重但是又不方便直接开数组的情况。set 中的元素是唯一的,其内部采用“红黑树”实现。注:本文章只列举 set 在 ACM 中的常见操作,如需了解更多有关 set 内容,请参考 C++官方文档Set 的基本用法头文件 #include <set>需要使用 std...
·
简介
- 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
更多推荐
所有评论(0)