STL容器系列文章:set容器

1. 头文件

#include <set>

2. 定义和性质

  • 关联容器,元素唯一(区别于multiset),且元素有序(区别于unordered_set)
  • set中元素不能直接改变,会破坏set的结构
  • 内部采用红黑树RB Tree实现,一种非严格意义的二叉查找树
  • set中只包含关键字,而不是键值对
  • 原型:参数1为数据类型,参数2默认是升序less,参数3一般用不到
template <class T,						// 键和值的类型type
		  class Compare = less<T>,		// 指定set容器内部的排序规则,默认升序less<T>
		  class Alloc = allocator<T>	// 指定分配对象的类型
		  > class set;

3. 构造

set<int> a;
set<int> a{1, 2, 3};
set<int> b(a);					// 用集合a初始化集合b
set<int> b(a.begin(), a.end());
set<int, std::greater<int>> a;	// 通过greater设置为降序排列

4. 常用方法

  • 容量
方法说明
mySet.size();容器大小
mySet.max_size();容器最大容量
mySet.empty();是否为空
  • 添加
方法说明
mySet.insert(const T& ele);添加元素
mySet.insert(iterator it, const T& ele);某个位置(之前)插入元素
mySet.insert(set2.first, set2.last);插入另一个set中[first, last)元素
  • 删除
方法说明
mySet.erase(const T& ele);删除某个元素
mySet.erase(iterator it);删除迭代器所指的元素
mySet.erase(iterator first, iterator last);删除[first, last)迭代器区间元素
mySet.clear();清空所有元素
  • 查找
方法说明
mySet.find(element);查找某个元素,成功返回迭代器,识别返回end()
mySet.count(element);返回0或1,set中元素唯一,不是很实用
// lower_bound, 返回第一个不小于key的元素的迭代器,否则返回mySet.end()
set<int>::iterator it = mySet.lower_bound(key);

// upper_bound, 返回第一个大于key的元素的迭代器,否则返回mySet.end()
set<int>::iterator it = mySet.upper_bound(key);

// equal_range, // 相当于lower_bound和upper_bound的组合
// 返回一个key取值的上下限对应的迭代器 [first, last)
pair<set<int>::iterator first, set<int>::iterator last> s_pair
	= mySet.equal_range(key);
lower_bound, 不小于;upper_bound, 大于;equal_range, 迭代器范围
  • 交换
方法说明
mySet.swap(set<T>& anotherSet);交换两个容器的元素
swap(set1, set2);另一种形式
  • 迭代器
方法说明
begin()/end()正向迭代器
rbegin()/rend()反向迭代器
cbegin()/cend()const迭代器
注:可以通过next/prev/advance函数访问特定迭代器元素

5. 总结

  • 插入元素使用insert或emplace,不能用push_back/front
  • set不支持resize()/at()函数,查找元素使用find或count
  • set元素自动排序,不支持STL的reverse和sort算法
  • set的要点:RB Tree,有序,唯一
  • set查找和插入元素的时间复杂度O(logN)二分查找,对数时间复杂度

参考文章
set容器的定义和方法
set容器的方法实例

created by shuaixio, 2021.06.17

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值