首页 > 其他分享 >STL 容器以及各函数及其复杂度

STL 容器以及各函数及其复杂度

时间:2024-07-25 14:51:19浏览次数:12  
标签:容器 end 迭代 STL 复杂度 元素 back queue

主要是实质、函数、性质。
如果没有特殊提出,那么是常数复杂度。

vector

相当于变长数组。

  • 支持随机访问(可以直接查询 \(v_i\)),但是不任意位置 \(O(1)\) 插入。通常为了保证效率,只在末尾加入删除元素。
  • size:返回实际长度(通常声明的长度会大于实际长度),也就是包含的元素个数。
  • empty:判断是否为空,是返回 \(1\),不是返回 \(0\)。
  • clear:直接清空。时间复杂度线性。
  • 迭代器:随机访问迭代器(注意),可以直接进行加减操作(作差、求和也可)。
  • begin/end:返回第一个和最后一个函数的迭代器,如果想返回值的话,可以用 *v.begin (),与数组的 \(a_0\) 效果相同。注意下标是从零开始,所以 *a.end () 是越界访问。
  • front/back:返回第一个或最后一个元素,即 a.front () = *a.begin ()a.back () = *--a.end ()
  • push_back/pop_back:在末尾插入或者删除元素。

可以代替邻接表存边,如果想连一条 \(x\) 到 \(y\) 的有向边,那么只需:

v[x].push_back (y) ;

无向边同理。

queue

FIFO,从队尾进入,队头出去。

  • push:入队。
  • pop:出队。
  • front:询问队头元素。
  • back:询问队尾元素。

用于 SPFA 和其他的什么东西,只不过快死掉就是了。

priority_queue

默认是一个大根二叉堆(其实不能算队列,但是它叫 queue,那就算到这里面好了)。

  • 相比 queue 多了一个 top 函数,可以查询堆顶元素(也就是最大值)。
  • 支持重载小于号。
  • 也可以实现小根堆,有这么两个方法:
    1.插入原数的相反数,这个方法容易废。
    2.priority_queue < int ,vector < int > ,greater < int > > q

deque

双端队列,相当于一个头朝左和一个头朝右的队列混到了一起,也可以看做一个 queue 和 vector 的结合。

  • 相比 queue,它支持随机访问。
  • 除了 front 和 back,它具有 begin/end 两个头、尾迭代器。
  • 不仅有 push_back 和 pop_back,还有 push_front 和 pop_front(因为是双端)。
  • 线性的 clear。

有人用这个玩意写单调队列,但是 STL 让人感觉不靠谱,不如手写。

set

只要你学过高中数学(其实不学也知道),就会知道 set(集合)具有互异性,也就是这个玩意可以自动帮你去重,但是他们同时是有序的默认可以单增排序,所以不具有无序性。

  • size/empty/clear 同 vector。
  • 迭代器:是双向访问迭代器,支持随机访问,只能 ++ 或者 --
  • begin/end 同 vector。
  • insert:插入操作,复杂度 \(\mathcal{O}(\log n)\),所以要是插入量大有可能炸掉,但是几率不很大。
  • find:在本集合中寻找是否有给定值,要是有返回迭代器,否则返回 s.end (),仍然带一个 \(\log\)。
  • lower(upper)_bound:形式稍有不同,只需 s.lower(upper)_bound (x) 即可返回迭代器。
  • erase:如果给出的是迭代器,就删除迭代器指向位置的元素(\(\mathcal{O}(\log n)\)),如果给出的是值,那么会删除等于这个值的元素(\(\mathcal{O}(k+\log n)\),其中 \(k\) 是被删除的元素个数),在 set 下等效,但是到 multimap 就不一样了。这个玩意好用,但是复杂度让人隐隐约约不太放心。
  • count:返回集合中等于给定值的元素的个数,\(\mathcal{O}(k+\log n)\)。

multiset

与 set 大致相同,但是允许重复。
唯一需要注意的是 erase,如果你给的是迭代器当然没有问题,但是如果是数值就需要注意了,因为它可能会删好几个。

map

不是地图,是映射。
其形式为:

map < key_type ,value_type > m ;

通常是把一个比较复杂的(如字符串)键值映射到比较简单的域上(如整数)。

  • size/empty/clear/begin/end/迭代器/insert/erase/find:同 set。
  • map 支持随机访问,这是最吸引人的地方。

但是由于它自带一个 \(\log\),可能会被爆破,比如我。

unordered_map

这个东西不像 map 一样有序,但是 hash 很喜欢它。
在单个查找的时候比 map 优秀,平均是常数复杂度。

bitset

好像没什么存在感,懒得弄。

标签:容器,end,迭代,STL,复杂度,元素,back,queue
From: https://www.cnblogs.com/Tomoyuki-Mizuyama/p/18323065

相关文章

  • 算法的理解及其复杂度分析
    1.什么是算法算法(Algorithm)一个有限指令集接受一些输入(有些情况下不需要输入)产生输出一定在有限步骤之后终止每一条指令必须:        有充分明确的目标,不可以有歧义        计算机能处理的范围之内        描述应不依赖于任何一种计......
  • Docker容器生命周期:创建、启动、暂停与停止
    摘要本博客通过标题《Docker容器生命周期:创建、启动、暂停与停止》为主线,探讨了容器生命周期的各个关键阶段。文章从引言开始,解释了容器化技术的重要性,并深入介绍了容器的生命周期概述、创建容器、启动与运行容器、暂停与继续容器、停止与重启容器、删除容器等各个阶段的操作和注......
  • 探索Docker Compose:轻松管理多容器应用的最佳实践 转载
    目录1docker-compose1.6.1简单命令1.6.2build1.6.3depends_on1.6.4deploy1.6.5logging1.6.6network_mode1.6.7secrets1.1compose编排工具简介1.2安装docker-compose1.3编排启动镜像1.4haproxy代理后端docker容器1.5安装soca......
  • docker容器操作脚本
    #1.创建目录cd$HOME&&mkdir-P.mine/bin&&cd.mine/bin&&touchd-usegeditd-use#将下面内容复制到d-use中#2.加入环境变量vim~/.bashrcexportPATH=.mine/bin:$PATH#将.mine/bin目录加入环境变量source~/.bashrc#然后就可以使用d-use命令d-use容器号/......
  • JVM 内存结构、垃圾回收机制与并发容器
    目录一、JVM内存结构 1.程序计数器(ProgramCounterRegister): 2.Java虚拟机栈(JVMStack): 3.本地方法栈(NativeMethodStack): 4.堆(Heap): 5.方法区(MethodArea):二、垃圾回收机制 1.标记-清除算法: 2.复制算法: 3.标记-整理算法: 4.分代收集:三、并发容器......
  • 在K8S中,容器提供一个服务,外部访问慢,到底是容器网络问题?还是容器服务问题?这种怎么排查?
    在K8S(Kubernetes)中,当容器提供的服务外部访问慢时,可能是由容器网络问题或容器服务问题中的一个或多个因素导致的。为了有效排查这个问题,可以按照以下步骤进行:一、初步排查检查外部访问方式:确认外部是通过哪种方式访问服务的,如LoadBalancer、NodePort、Ingress等。检查相应的......
  • 在K8S中,我们公司用户反应pod连接数非常多,希望看一下这些连接都是什么信息?什么状态?怎么
    在K8S中,当用户反映Pod连接数非常多时,为了查看这些连接的具体信息和状态,并考虑到容器内没有集成bash环境和网络工具的情况,可以采取以下步骤进行排查:一、确认问题并收集信息查看Pod状态:使用kubectlgetpods命令查看Pod列表,确认哪个Pod的连接数异常。使用kubectldescribepod......
  • 在K8S中,外部访问容器服务,比如说提供了一个域名,链路怎么走?数据经过哪些组件?
    在K8S(Kubernetes)中,外部访问容器服务并涉及到一个域名时,整个访问链路会经过多个组件,确保请求能够正确地被路由到目标服务。以下是详细的链路流程和涉及的组件:1.链路流程域名解析:当用户在浏览器或客户端输入域名时,首先会进行DNS解析。DNS服务器会将域名解析为对应的IP地址。......
  • 使用iptables管控docker容器
    docker与iptables说明某些项目考虑到安全问题,需要启用iptables来进行加固。根据官方文档介绍(https://dockerdocs.cn/network/iptables/):在Linux上,Docker操纵iptables规则以提供网络隔离。尽管这是实现的详细信息,并且您不应修改Docker在iptables策略中插入的规则,但是如果您想要......
  • 19、Python之容器:快来数一数,24678?Counter能数得更好
    引言关于数据的分组计数,前面的文章中已经涉及了很多次。眼下要进行分组计数,我们可用的方法有:1、直接使用dict进行计数,需要对首次出现的键进行判断初始化的操作;2、使用dict的setdefault()方法进行计数,代码可以简化一些,虽然方法名有点怪;3、defaultdict进行计数,可以设置自动......