STL容器篇:set

1 认识set和multiset

set名为集合,顾名思义只有键值,而不像map那样既有键值(key)又有实值(value)。而且STL中的set有个特性是所有的元素都会根据元素的键值自动被排序。由于RB-tree是一种平衡二叉树,自动排序的效果很不错,因此标准的STL set以RB-tree作为底层机制。

我们可以通过set的迭代器修改set元素的值么?

不行!因为set元素值就是其键值,这关系到了set元素的排序规则,如果任意改变set元素值,会严重破坏set组织。因此set的迭代器是一种constant iterators

那么set和multiset又有什么区别呢?

set不允许两个元素有相同的键值,如果你的数据中有相同的键值那么可以使用multiset,他们在其他方面基本没有区别。

如何才能使用set和multiset呢?

set和multiset具有相同的头文件: #include <set>

2 set的排序

因为set和multiset没有本质上的区别,在后面我们均只讨论set,所有内容同样适用于multiset。

在定义set的时候,可以指定其排序规则(从小到大还是从大到小),如果是从小到大就使用multiset<int, less<type>>或者multiset<int>(默认就是从小到大排序的,因此less可以省略),如果是从大到小就使用multiset<int, greater<type>>。

示例代码:

#include <iostream>
#include <set>
#include <algorithm>
using namespace std;

int main() {
	multiset<int, less<int>> mset;
	mset.insert(3);
	mset.insert(2);
	mset.insert(15);
	mset.insert(7);
	mset.insert(5);
	
	mset.erase(upper_bound(mset.begin(), mset.end(), 3));
	
	for(auto iter : mset) {
		cout << iter << endl;
	}
} 

输出结果:

2 3 7 15

想知道为什么5不见了吗,想知道为什么不见的是5吗?可以移步upper_bound的使用方法介绍看看原委。

发布了115 篇原创文章 · 获赞 96 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/qq_26822029/article/details/89299280