C++(进阶) 第4章 map和set的使⽤

C++(进阶) 第4章 map和set的使⽤


文章目录


前言

上一篇博客写了二叉搜索树,这一篇博客会在上一篇博客原来的上在深入介绍


我们搜索一个数通常有下面几种方式

  1. 暴力查找->效率低下
  2. 排序+二分查找 ->插入删除代价大,因为它底层是数组
  3. 链式结构的二叉搜索树,它输入数据最多最优只需要走它的高度即可,做差也有N的时间复杂度

为了稳定二叉树时间复杂度,这里引入平衡二叉树(AVL,红黑树)

  1. 二叉搜索树O(N)
  2. 平衡二叉树(AVL,红黑树) O( log N)
  3. 多叉平衡搜索树(B树系列)
  4. 哈希

我们现实中模式差不多有俩种

  1. key模式 ->在不在 ,比如门禁系统
  2. key/value 通过一个值(key)找另一个值(value), 比如词典,输入中文显示出它的英文

一、序列式容器和关联式容器

  1. 序列容器:前⾯我们已经接触过STL中的部分容器如string、vector、list、deque、array、forward_list等,这些容器统称为序列式容器,因为逻辑结构为线性序列的数据结构,两个位置存储的值之间⼀般没有紧密的关联关系,⽐如交换⼀下,他依旧是序列式容器。顺序容器中的元素是按他们在容器中的存储位置来顺序保存和访问的。
  2. 关联式容器也是⽤来存储数据的,与序列式容器不同的是,关联式容器逻辑结构通常是⾮线性结构,
    两个位置有紧密的关联关系,交换⼀下,他的存储结构就被破坏了。顺序容器中的元素是按关键字来
    保存和访问的。关联式容器有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提供了大量能使我们快速便捷地处理数据的函数和方法。

相关推荐
Dream it possible!几秒前
LeetCode 热题 100_在排序数组中查找元素的第一个和最后一个位置(65_34_中等_C++)(二分查找)(一次二分查找+挨个搜索;两次二分查找)
c++·算法·leetcode
柠石榴6 分钟前
【练习】【回溯No.1】力扣 77. 组合
c++·算法·leetcode·回溯
王老师青少年编程7 分钟前
【GESP C++八级考试考点详细解读】
数据结构·c++·算法·gesp·csp·信奥赛
澄澈天空2 小时前
C++ MFC添加RichEditControl控件后,程序启动失败
c++·mfc
Lzc7742 小时前
C++初阶——简单实现vector
c++·简单实现vector
一个小白13 小时前
C++——list模拟实现
开发语言·c++
程序员老舅3 小时前
C++ Qt项目教程:WebServer网络测试工具
c++·qt·测试工具·webserver·qt项目·qt项目实战
靡不有初1114 小时前
CCF-CSP第18次认证第一题——报数【两个与string相关的函数的使用】
c++·学习·ccfcsp
cookies_s_s5 小时前
Linux--进程(进程虚拟地址空间、页表、进程控制、实现简易shell)
linux·运维·服务器·数据结构·c++·算法·哈希算法
不想编程小谭6 小时前
力扣LeetCode: 2506 统计相似字符串对的数目
c++·算法·leetcode