首页 > 其他分享 >__gnu_pbds::tree 用法简介

__gnu_pbds::tree 用法简介

时间:2024-08-19 21:39:00浏览次数:6  
标签:__ pbds 迭代 gnu tree std

__gnu_pbds::tree 用法简介

概述

pbds即平板电视,里面实现了很多数据结构,NOI系列赛事可以使用,但很多 OJ 和网站无法使用。

其中有 __gnu_pbds::tree,是平衡树,支持查找位置、查找第 \(k\) 大、分裂、合并。功能远强与 std::set

性能

实现是红黑树,空间常数是 Treap 的 \(1.5\) 倍,时间常数是 Treap 的 \(1.1\) 至 \(1.2\) 倍。

效率还可以,空间回收优秀,大部分平衡树题都可以用。

用法

库文件 & 命名空间

头文件

#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>

其中第一个头文件是使用 pbds 都要带的。

命名空间为 __gnu_pbds

注意你不应 using namespace __gnu_pbds,因为它和 std 都有 priority_queue,并且它还包含 tree trie 这样名字的数据结构。

定义

__gnu_pbds ::tree<Key, Mapped, Cmp_Fn = std::less<Key>, Tag = rb_tree_tag,
                  Node_Update = null_tree_node_update,
                  Allocator = std::allocator<char> >

Key存储的数据类型,注意不能存储多个值相同的元素,若需要可以用 pair 或封成 struct多存一个时间戳

Mapped 映射类型,如果无映射类似于 std::set,此处需填 __gnu_pbds::null_type,若有映射,如 std::map,应填映射类型,类似于 std::map<Key,Value>Value 类型。

Cmp_Fn 比较类型,默认从小到大,其用 std::less<Key>,从大到小可用 std::greater<Key>,若是自定义类型,这两者都需要重载小于号。

Tag 底层数据结构,默认为 rb_tree_tag,红黑树,速度最快。还可选 splay_tree_tagov_tree_tag 速度较慢别用。

Node_Update 更新节点的策略,可用于进阶操作,这里不提及。

Allocator 空间分配器类型,你不用管它。

  • 一般来说,你只需要用无映射基础版本即可,即 tree<Key,null_type>

迭代器

使用 iterator访问迭代器:

tree::iterator

同时它有 .begin().end(),用法和 std::set 类似。

成员函数

  • size() empty(),用法类似。

  • insert(x) 用法类似,插入元素,返回一个pairfirst是迭代器,second是一个 bool 表示是否插入成功

  • erase(x),用法类似,删除值为 x 的元素或删除迭代器为 x 的元素,删除迭代器后迭代器失效。函数返回一个 bool 表示是否成功。

  • lower_bound(x) upper_bound(x),用法类似,第一个大于等于和第一个大于,返回迭代器。

  • order_of_key(x) 返回值为 \(x\) 的排名,按定义的比较方式比较。

  • find_by_order(x) 返回按比较方式比较的第 \(x\) 小的迭代器。

  • x.join(y) 将 \(y\) 树并入 \(x\) 树,\(y\) 被删除。前提是两棵树值域互不相交

  • x.split(k,y)分裂,值小于等于 \(k\) 的属于 \(x\) 树,剩下的属于 \(y\) 树。

以上函数的时间复杂度均为 \(O(\log n)\)。

标签:__,pbds,迭代,gnu,tree,std
From: https://www.cnblogs.com/dccy/p/18368166

相关文章

  • CSP24
    学了些DP学校题库有\(BUG\)首先要满足条件\(x,y\)的二进制有1的位必然包含\(a\),然后让\(s-2a\),也就是除去二进制包含\(a\)有1的位,然后\(<0\)肯定无解,其次是如果有与\(a\)同一级的含\(1\)二进制位也不合法点击查看代码#include<bits/stdc++.h>#definespeed()ios::sync......
  • 用for循环输出数组与初识增强for循环
    1.定义一个数组2.使用for循环设置编码3.输出带有编码的数组使用增强for循环输出数组1.依旧是定义数组2.设置一个新的变量x用于替代数组3.直接输出变量x即可......
  • Android开发 - DisplayMetrics 类控制布局图形的缩放显示解析
    DisplayMetrics是什么DisplayMetrics类在Android中用于获取设备的显示属性(像素等)DisplayMetrics的主要属性metrics.density:屏幕密度,用于决定屏幕上每英寸的像素数DisplayMetricsmetrics=newDisplayMetrics();density=metrics.density;常见值:0.75(低密度)、1.0......
  • rsync概述详解
    一、rsync基础概念:rsync是实时数据备份的作用1、rsync数据备份传输的方式本地模式:类似cp命令,与其不同的是,rsync属于增量备份远程方式模式:不区分服务端和客户端,实现两台主机时间到数据拷贝,可以直接进行数据的上传/下载进行备份/脚本打包守护进程模式:这种模式采用虚拟用户的......
  • c语言中读入整型数据和浮点型数据
     001、读入整型数据[root@PC1test]#lstest.c[root@PC1test]#cattest.c##测试脚本#include<stdio.h>intmain(void){inti;//声明整型变量puts("pleaseinputaninteger.");print......
  • docker部署gitlab
    gitlab拉取镜像dockerpull创建挂载目录mkdirgitlabcdgitlabmkdir-pdata/logmkdir-pdata/optmkdir-pdata/etc启动容器dockerrun-itd-p8443:443-p8090:80-p8022:22--namegitlab-v$PWD/data/etc:/etc/gitlab-v$PWD/data/log:/var/log/gitlab-v......
  • 打印99乘法表
    我们的核心思想是以小化大1.先写出1的所有乘法2.设置一个变量,使得不止有1乘n3.将1的乘法放入变量中,使得1再次被循环包起来4.解决重复乘法图片中出现了两次1*4,说明刚才的表达式会有重复相乘出现重复的原因:a有1~9的数字而i也会有1~9,a*i就必然会有重复,我们需要让一个......
  • csharpierrc.json 配置
    CSharpier配置.csharpierrc.json{"printWidth":100,"useTabs":false,"tabWidth":4,"endOfLine":"auto"}参数说明PrintWidth​Specifyatwhatpointtheprinterwillwrapcontent.Thisisnotahardlimit.......
  • Redis非关系型数据库
    Redis是什么Redis:REmoteDIctionaryServer(远程字典服务器)是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(Key/Value)分布式内存数据库,基于内存运行,并支持持久化的NoSQL数据库,是当前最热门的NoSQL数据库之一,也被人们称为数据结构服务器。Windows安装redis1.下载......
  • ControlNeXt: Powerful and Efficient Control for Image and Video Generation(2024,
    ControlNeXt:PowerfulandEfficientControlforImageandVideoGeneration(2024,8)paperGithub进一步在ControlNet上进行了改进,主要针对一下两点对于每一个模块添加一个Zero-Conv也会占用很多显存.Zero-Conv两个模态的输出的mean、var具有差异,导致收敛很慢.针对1,......