set和map都是用二叉搜索树来维护的容器:
因此能高效的完成如下操作且时间复杂度均为O(logn)
- 插入一个数值
- 查询是否包含某个数值
- 删除某个数值
不同的是:
- set是维护值的容器
- map是维护键和键对应值的容器
1.set相关操作
- 头文件:
#include<set>
- 声明、插入、删除:
//声明
set<int> s;
//插入元素
s.insert(3);
//删除元素
s.erase(3);
- 遍历元素:
//声明迭代器
set<int>::iterator ite;
//遍历元素,这里的结果为由小到大的排序数列
for (ite = s.begin(); ite != s.end(); ite++)
cout << *ite;
- 查找元素的两种方法:
//声明迭代器
set<int>::iterator ite;
//方法一
ite = s.find(1);
if (ite == s.end()) puts("not found\n");
else puts("found\n");
//方法二
if (s.count(3) != 0) puts("found\n");
else puts("not found\n");
2.map相关操作
- 头文件
#include<map>
- 声明、插入、删除:
//声明
map<int, const char*>m;
//插入
m.insert(make_pair(1, "one"));
m.insert(make_pair(2, "two"));
m[3] = "three"; //其他写法
//删除
m.erase(1);
- 遍历元素
//声明迭代器
map<int, const char*>::iterator ite2;
//遍历元素
for (ite2 = m.begin(); ite2 != m.end(); ite2++)
cout << ite2->first << ite2->second;
- 查找元素的两种写法
//方法1
ite2 = m.find(1);
if (ite2 == m.end()) puts("not found");
else puts(ite2->second); //输出one
//puts(ite2->second)可用puts(m[1])代替
//注意m[i]中的i必须在容器中存在
//方法2
if (m.count(3) != 0) puts(m[3]);
else puts("not found\n");
注:
我们都知道二叉搜索树会有退化的情况,但编程语言标准中的二叉搜索树很好地实现了平衡二叉树,因此避免了退化情况。