目录
以下文章参考文档
<set> - C++ Reference (cplusplus.com)
map - C++ Reference (cplusplus.com)
一、底层结构
C++中的set和map的底层结构是红黑树,红黑树是⼀颗平衡⼆叉搜索树。
(若不知道什么是红黑树的可以看看这篇文章->C++:红黑树的实现-CSDN博客)
二、set
1、set的介绍
- set底层是用红黑树实现,增删查效率是(O(logN)) ,迭代器遍历是走的搜索树的中序,所以是有序的。
- set的声明如下,T就是set底层关键字的类型。
- set默认要求T支持小于比较,如果不支持或者想按自己的需求走可以自行实现仿函数传给第⼆个模版参数(⼀般情况下,我们都不需要传后两个模版参数)
- set中只能存在一个相同的值,若插入相同的值给set,将会插入失败。
std::set template < class T, // set::key_type/value_type class Compare = less<T>, // set::key_compare/value_compare class Alloc = allocator<T> // set::allocator_type > class set;
set的支持正向和反向迭代遍历,遍历默认按升序顺序,因为底层是⼆叉搜索树,迭代器遍历走的中序;支持迭代器就意味着支持范围for,set的iterator和const_iterator都不支持迭代器修改数据,修改关键字数据,破坏了底层搜索树的结构。
2、set的使用
(1)set的插入(insert)
#include<iostream>
#include<set>
using namespace std;
int main()
{
set<int> s;
s.insert(5);
s.insert(2);
s.insert(7);
s.insert(5);
auto it = s.begin();
while (it != s.end())
{
cout << *it << " ";
++it;
}
cout << endl;
}
打印结果↓
如set介绍里第四条所述,set中只能存在一个相同的值,插入重复的5将会插入失败。而且set的底层是红黑树,(平衡二叉搜索树) 用迭代器遍历是用中序遍历,所以打印结果会是升序