C++:STL------set

本文介绍了C++STL中的set和multiset容器,包括它们的内部实现(红黑树),声明方式,以及支持的迭代器操作,如插入、查找、删除等,并列出了常用的方法和时间复杂度。
摘要由CSDN通过智能技术生成

C++:STL------set

1.about

头文件set主要包括set和multiset两个容器,分别是“有序集合”和“有序多重集”,即前者的元素不能重复,而后者可以包含若干个相等的元素。set和multiset的内部实现是一颗红黑树(平衡树的一种),它们支持的函数基本相同。

2.声明

#include <set>							//头文件
set<int> s1;							//存储int的有序集合set

struct rec{...};
set<rec> s2;

multiset<double> s3;

set<Type> s						      	//定义一个set容器
set<Type> s(s1)			              	//定义一个set容器,并用容器s1来初始化
set<Type> s(b, e)					  	//b和e分别为迭代器的开始和结束的标记
set<Type> s(s1.begin(), s1.begin()+3) 	//用容器s1的第0个到第2个值初始化s
set<Type> s(a, a + 5)      		      	//将a数组的元素初始化vec向量,不包括a[4]
set<Type> s(&a[1], &a[4]) 			  	//将a[1]~a[4]范围内的元素作为s的初始值

set和multiset存储的元素必须定义“小于号”运算符。

3.迭代器

set和multiset的迭代器称为“双向访问迭代器”。不支持“随机访问”,支持星号 (*) 解除引用,仅支持“++”和“–”两个与算术相关的操作。

set<int>::iterator it;

it = s.begin();
it++;
//it将指向“下一个”元素。这里的“下一个”是指在元素从小到大排序的结果中,排在it下一名的元素。
it--;
//同理,it将会指向排在“上一个”的元素。
//执行“++”和“--”操作的时间复杂度都是O(logn)。
//执行操作前后,务必仔细检查,避免迭代器指向的位置超出首、尾迭代器之间的范围。

4.method

方法描述实例时间复杂度
size实际长度(包含的元素个数)int x = s.size();O(1)
empty是否为空bool y = s.empty();O(1)
clear清空s.clear();O(n)
begin返回集合的首迭代器set::iterator it1 = s.begin();O(1)
end返回集合的尾迭代器set::iterator it2 = s.end();O(1)
insert将一个元素插入到集合s.insert(x);O(logn)
find在集合中查找等于x的元素,并返回指向该元素的迭代器。如不存在,返回s.end()set::iterator it = s.find(x);O(logn)
lower_bound查找>=x的元素中最小的一个,并返回指向该元素的迭代器set::iterator it = s.lower_bound(x);O(logn)
upper_bound查找>x的元素中最小的一个,并返回指向该元素的迭代器set::iterator it = s.upper_bound(x);O(logn)
erase从集合中删除迭代器 it 指向的元素 从集合中删除所有等于x的元素s.erase(it); s.erase(x);O(logn) O(k+logn),k为被删除元素个数
count返回集合中等于x的元素个数int y = s.count(x);O(k+logn),k为元素x个数
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值