C++(进阶) 第4章 map和set的使⽤
文章目录
- 前言
- 一、序列式容器和关联式容器
- 二、set
-
- [1. insert](#1. insert)
- 2.迭代器遍历
- 3.范围for
- 4.erase
- 5.count
- 6.lower_bound和upper_bound
- 三、multiset
- 总结
前言
上一篇博客写了二叉搜索树,这一篇博客会在上一篇博客原来的上在深入介绍
我们搜索一个数通常有下面几种方式
- 暴力查找->效率低下
- 排序+二分查找 ->插入删除代价大,因为它底层是数组
- 链式结构的二叉搜索树,它输入数据最多最优只需要走它的高度即可,做差也有N的时间复杂度
为了稳定二叉树时间复杂度,这里引入平衡二叉树(AVL,红黑树)
- 二叉搜索树O(N)
- 平衡二叉树(AVL,红黑树) O( log N)
- 多叉平衡搜索树(B树系列)
- 哈希
我们现实中模式差不多有俩种
- key模式 ->在不在 ,比如门禁系统
- key/value 通过一个值(key)找另一个值(value), 比如词典,输入中文显示出它的英文
一、序列式容器和关联式容器
- 序列容器:前⾯我们已经接触过STL中的部分容器如string、vector、list、deque、array、forward_list等,这些容器统称为序列式容器,因为逻辑结构为线性序列的数据结构,两个位置存储的值之间⼀般没有紧密的关联关系,⽐如交换⼀下,他依旧是序列式容器。顺序容器中的元素是按他们在容器中的存储位置来顺序保存和访问的。
- 关联式容器也是⽤来存储数据的,与序列式容器不同的是,关联式容器逻辑结构通常是⾮线性结构,
两个位置有紧密的关联关系,交换⼀下,他的存储结构就被破坏了。顺序容器中的元素是按关键字来
保存和访问的。关联式容器有map/set系列和unordered_map/unordered_set系列。
二、set
set和multiset参考⽂档
https://legacy.cplusplus.com/reference/set/
1. insert
这个就和之前的容器都一样比较简单
cpp
#include<bits/stdc++.h>
#include<set>
using namespace std;
int main()
{
set<int> s;
s.insert(5);
s.insert(2);
s.insert(7);
s.insert(4);
s.insert(1);
s.insert(9);
return 0;
}
2.迭代器遍历
cpp
#include<bits/stdc++.h>
#include<set>
using namespace std;
int main()
{
set<int> s;
s.insert(5);
s.insert(2);
s.insert(7);
s.insert(4);
s.insert(1);
s.insert(9);
set<int>::iterator it = s.begin();
while (it != s.end())
{
cout << *it << " ";
++it;
}
return 0;
}
可以看到这里迭代器默认走的是中序的
3.范围for
这个也挺简单的
cpp
#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
#include<set>
using namespace std;
int main()
{
set<int> s;
s.insert(5);
s.insert(2);
s.insert(7);
s.insert(4);
s.insert(1);
s.insert(9);
set<int>::iterator it = s.begin();
while (it != s.end())
{
cout << *it << " ";
++it;
}
cout << endl;
for (auto e : s)
{
cout << e << " ";
}
return 0;
}
4.erase
这里有一个细节假如要删除这颗树里最小的值可以直接用迭代器删除
5.count
这个函数的功能不能统计次数,这个是用来判断在不在的
6.lower_bound和upper_bound
这俩个函数返回的都是查找的那个数的迭代器这类配合erase可以删除一个范围的数
cpp
#include<bits/stdc++.h>
#include<set>
using namespace std;
int main()
{
set<int> s;
for (int i = 1; i <= 5; i++)
{
s.insert(i);
}
for (auto e : s)
{
cout << e << ' ';
}
cout << endl;
auto itlow = s.lower_bound(2);
auto itup = s.upper_bound(4);
s.erase(itlow, itup);
for (auto e:s)
{
cout << e << ' ';
}
return 0;
}
三、multiset
这个和set的区别就是set不允许数据有重复的,但是这个就可以,这个是直接排序
它的set的区别就是这个查找一个有相同的数的时候它返回的是中序遍历的第一个这个可以直接去查找这一段相同的值
cpp
int main()
{
multiset<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(4);
s.insert(1);
for (auto e : s)
{
cout << e << ' ';
}
cout << endl;
auto pos = s.find(1);
int x;
cin >> x;
while (pos !=s.end() && *pos == x)
{
cout << *pos << " ";
pos++;
}
return 0;
}
这样就更有意义
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。