当前位置:   article > 正文

C++ STL之set详解_c++ stl set

c++ stl set

返回STL主目录

7 set

7.1 介绍

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

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

//头文件
#include<set>
//初始化定义
set<int> s;
  • 1
  • 2
  • 3
  • 4

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 << " ";
  • 1
  • 2
  • 智能指针
for(auto i : s)
	cout << i << endl;
  • 1
  • 2
  • 访问最后一个元素
//第一种
cout << *s.rbegin() << endl;
  • 1
  • 2
 //第二种
set<int>::iterator iter = s.end();
iter--;
cout << (*iter) << endl; //打印2;
  • 1
  • 2
  • 3
  • 4
//第三种
cout << *(--s.end()) << endl;
  • 1
  • 2

7.4 重载<运算符

  • 基础数据类型

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

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

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

//重载 < 运算符
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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

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 << " ";
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 高级数据类型(结构体)

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

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
*/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

7.5 其它set

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/778048
推荐阅读
相关标签
  

闽ICP备14008679号