C++学习笔记--STL标准模板库的认识与使用--关联式容器--set(集合)

1、什么是集合?

C++ Sets

(1)集合(Set)是一种包含已排序对象的关联容器

(2)set 是关联容器,含有键值类型对象的已排序集,搜索、移除和插入拥有对数复杂度。set 内部通常采用红黑树实现。平衡二叉树的特性使得 set 非常适合处理需要同时兼顾查找、插入与删除的情况。

(3)和数学中的集合相似,set 中不会出现值相同的元素。如果需要有相同元素的集合,需要使用 multisetmultiset 的使用方法与 set 的使用方法基本相同。

2、相关操作(函数)

begin()

返回指向第一个元素的迭代器

clear()

清除所有元素

count()

返回某个值元素的个数

empty()

如果集合为空,返回true

end()

返回指向最后一个元素的迭代器

equal_range()

返回集合中与给定值相等的上下限的两个迭代器

erase()

删除集合中的元素

find()

返回一个指向被查找到元素的迭代器

get_allocator()

返回集合的分配器

insert()

在集合中插入元素

lower_bound()

返回指向大于(或等于)某值的第一个元素的迭代器

key_comp()

返回一个用于元素间值比较的函数

max_size()

返回集合能容纳的元素的最大限值

rbegin()

返回指向集合中最后一个元素的反向迭代器

rend()

返回指向集合中第一个元素的反向迭代器

size()

集合中元素的数目

swap()

交换两个集合变量

upper_bound()

返回大于某个值元素的迭代器

value_comp()

返回一个用于比较元素间的值的函数

 3、插入与删除操作

  • insert(x) 当容器中没有等价元素的时候,将元素 x 插入到 set 中。
  • erase(x) 删除值为 x 的 所有 元素,返回删除元素的个数。
  • erase(pos) 删除迭代器为 pos 的元素,要求迭代器必须合法。
  • erase(first,last) 删除迭代器在  范围内的所有元素。
  • clear() 清空 set

4、迭代器

  1. begin()/cbegin()
    返回指向首元素的迭代器,其中 *begin = front
  2. end()/cend()
    返回指向数组尾端占位符的迭代器,注意是没有元素的。
  3. rbegin()/crbegin()
    返回指向逆向数组的首元素的逆向迭代器,可以理解为正向容器的末元素。
  4. 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

猜你喜欢

转载自blog.csdn.net/qq_51701007/article/details/121277317