C++ STL之set详解

返回STL主目录

7 set

7.1 介绍

set容器中的元素不会重复,当插入集合中已有的元素时,并不会插入进去,而且set容器里的元素自动从小到大排序。

即:set里面的元素不重复 且有序

//头文件
#include<set>
//初始化定义
set<int> s;

7.2 函数方法

代码含义
s.begin()返回set容器的第一个元素的地址(迭代器) O ( 1 ) O(1) O(1)
s.end()返回set容器的最后一个元素的下一个地址(迭代器) O ( 1 ) O(1) O(1)
s.rbegin()返回逆序迭代器,指向容器元素最后一个位置 O ( 1 ) O(1) O(1)
s.rend()返回逆序迭代器,指向容器第一个元素前面的位置 O ( 1 ) O(1) O(1)
s.clear()删除set容器中的所有的元素,返回unsigned int类型 O ( N ) O(N) O(N)
s.empty()判断set容器是否为空 O ( 1 ) O(1) O(1)
s.insert()插入一个元素
s.size()返回当前set容器中的元素个数 O ( 1 ) O(1) O(1)
erase(iterator)删除定位器iterator指向的值
erase(first,second)删除定位器first和second之间的值
erase(key_value)删除键值key_value的值
查找
s.find(element)查找set中的某一元素,有则返回该元素对应的迭代器,无则返回结束迭代器
s.count(element)查找set中的元素出现的个数,由于set中元素唯一,此函数相当于查询element是否出现
s.lower_bound(k)返回大于等于k的第一个元素的迭代器 O ( l o g N ) O(logN) O(logN)
s.upper_bound(k)返回大于k的第一个元素的迭代器 O ( l o g N ) O(logN) O(logN)

7.3 访问

  • 迭代器访问
for(set<int>::iterator it = s.begin(); it != s.end(); it++)
	cout << *it << " ";
  • 智能指针
for(auto i : s)
	cout << i << endl;
  • 访问最后一个元素
//第一种
cout << *s.rbegin() << endl;
 //第二种
set<int>::iterator iter = s.end();
iter--;
cout << (*iter) << endl; //打印2;
//第三种
cout << *(--s.end()) << endl;

7.4 重载<运算符

  • 基础数据类型

方式一:改变set排序规则,set中默认使用less比较器,即从小到大排序。(常用)

set<int> s1; // 默认从小到大排序
set<int, greater<int> > s2; // 从大到小排序

方式二:重载运算符。(很麻烦,不太常用,没必要)

//重载 < 运算符
struct cmp {
    bool operator () (const int& u, const int& v) const {
       // return + 返回条件
       return u > v;
    }
};
set<int, cmp> s; 

for(int i = 1; i <= 10; i++)
    s.insert(i);
for(auto i : s)
    cout << i << " ";
// 10 9 8 7 6 5 4 3 2 1

方式三:初始化时使用匿名函数定义比较规则

set<int, function<bool(int, int)>> s([&](int i, int j){
    return i > j; // 从大到小
});
for(int i = 1; i <= 10; i++)
    s.insert(i);
for(auto x : s)
    cout << x << " ";
  • 高级数据类型(结构体)

直接重载结构体运算符即可,让结构体可以比较。

struct Point {
	int x, y;
	bool operator < (const Point &p) const {
		// 按照点的横坐标从小到大排序,如果横坐标相同,纵坐标从小到大
		if(x == p.x)
			return y < p.y;
		return x < p.x;
	}
};

set<Point> s;
for(int i = 1; i <= 5; i++) {
    int x, y;
    cin >> x >> y;
    s.insert({x, y});
}	
/* 输入
5 4
5 2
3 7
3 5
4 8
*/

for(auto i : s)
    cout << i.x << " " << i.y << "\n";
/* 输出
3 5
3 7
4 8
5 2
5 4
*/

7.5 其它set

multiset:元素可以重复,且元素有序

unordered_set :元素无序且只能出现一次

unordered_multiset : 元素无序可以出现多次

如要获取所有内容的PDF文件,请在公众号【行码棋】回复【STL】获取,非常抱歉了。
Update:2023-12-11更新PDF文件

  • 36
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
引用提供了一些使用set的常见操作和方法。如果要访问set中的最后一个元素,有几种方法可以实现。第一种方法是使用rbegin()函数,它返回一个指向set中最后一个元素的反向迭代器,然后可以使用*运算符来获取该元素的值。第二种方法是使用end()函数返回一个指向set末尾的迭代器,然后通过--运算符将迭代器移动到最后一个元素,再使用*运算符获取该元素的值。第三种方法是直接使用end()函数返回的迭代器,然后使用--运算符将迭代器移动到最后一个元素,再使用*运算符获取该元素的值。提供了一个重载<运算符的示例代码。在这个示例中,定义了一个结构体node,并在结构体中重载了<运算符。通过重载<运算符,我们可以自定义set中元素的比较规则。在main函数中,创建了一个set<node>类型的集合s,并插入了一些元素。通过遍历集合s,我们可以看到集合中的元素按照我们定义的比较规则进行排序。介绍了set中lower_bound和upper_bound函数的使用。lower_bound函数返回大于或等于给定值的第一个元素的迭代器,而upper_bound函数返回大于给定值的第一个元素的迭代器。在示例代码中,首先创建了一个set<int>类型的集合s,并插入了一些元素。然后使用lower_bound和upper_bound函数分别查找给定值的边界,并输出对应的元素值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++ STLset详解](https://blog.csdn.net/qq_50285142/article/details/122304728)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【c++STL——第八讲】set系列 (常用知识点总结)](https://blog.csdn.net/m0_63233163/article/details/124645182)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行码棋

码字好辛苦,总结好吃力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值