1、什么是集合?
C++ Sets
(1)集合(Set)是一种包含已排序对象的关联容器
(2)
set
是关联容器,含有键值类型对象的已排序集,搜索、移除和插入拥有对数复杂度。set
内部通常采用红黑树实现。平衡二叉树的特性使得set
非常适合处理需要同时兼顾查找、插入与删除的情况。(3)和数学中的集合相似,
set
中不会出现值相同的元素。如果需要有相同元素的集合,需要使用multiset
。multiset
的使用方法与set
的使用方法基本相同。
2、相关操作(函数)
返回指向第一个元素的迭代器 |
|
清除所有元素 |
|
返回某个值元素的个数 |
|
如果集合为空,返回true |
|
返回指向最后一个元素的迭代器 |
|
返回集合中与给定值相等的上下限的两个迭代器 |
|
删除集合中的元素 |
|
返回一个指向被查找到元素的迭代器 |
|
返回集合的分配器 |
|
在集合中插入元素 |
|
返回指向大于(或等于)某值的第一个元素的迭代器 |
|
返回一个用于元素间值比较的函数 |
|
返回集合能容纳的元素的最大限值 |
|
返回指向集合中最后一个元素的反向迭代器 |
|
返回指向集合中第一个元素的反向迭代器 |
|
集合中元素的数目 |
|
交换两个集合变量 |
|
返回大于某个值元素的迭代器 |
|
返回一个用于比较元素间的值的函数 |
3、插入与删除操作
insert(x)
当容器中没有等价元素的时候,将元素 x 插入到set
中。erase(x)
删除值为 x 的 所有 元素,返回删除元素的个数。erase(pos)
删除迭代器为 pos 的元素,要求迭代器必须合法。erase(first,last)
删除迭代器在 范围内的所有元素。clear()
清空set
。
4、迭代器
begin()/cbegin()
返回指向首元素的迭代器,其中*begin = front
。end()/cend()
返回指向数组尾端占位符的迭代器,注意是没有元素的。rbegin()/crbegin()
返回指向逆向数组的首元素的逆向迭代器,可以理解为正向容器的末元素。rend()/crend()
返回指向逆向数组末元素后一位置的迭代器,对应容器首的前一个位置,没有元素。以上列出的迭代器中,含有字符
c
的为只读迭代器,你不能通过只读迭代器去修改set
中的元素的值。如果一个set
本身就是只读的,那么它的一般迭代器和只读迭代器完全等价。只读迭代器自 C++11 开始支持。
5、查找操作
count(x)
返回set
内键为 x 的元素数量。find(x)
在set
内存在键为 x 的元素时会返回该元素的迭代器,否则返回end()
。lower_bound(x)
返回指向首个不小于给定键的元素的迭代器。如果不存在这样的元素,返回end()
。upper_bound(x)
返回指向首个大于给定键的元素的迭代器。如果不存在这样的元素,返回end()
。empty()
返回容器是否为空。size()
返回容器内元素个数。
6、代码示例:
set
在贪心中的使用在贪心算法中经常会需要出现类似 找出并删除最小的大于等于某个值的元素。这种操作能轻松地通过
set
来完成。
#include<iostream>
#include<set>
using namespace std;
int main()
{
set<int> available;
int x = 3;
//给集合赋值
for (int i = 0; i < 5; i++)
available.insert(i);
set<int>::iterator it1;
for (it1 = available.begin(); it1 != available.end(); it1++)
cout << *it1 << ' ';
cout << endl;
set<int>::iterator it = available.lower_bound(x);//返回指向首个不小于 x 的迭代器。如果不存在这样的元素,返回 end()。
if (it == available.end())//如果不存在这样的元素
{
cout << "None"<<endl;
}
else //存在则删除这个元素
{
available.erase(it);
}
cout << endl;
set<int>::iterator it2;
for (it2 = available.begin(); it2 != available.end(); it2++)
cout << *it2 << ' ';
return 0;
}
7、运行结果
r