魔法之 pb_ds

news/2024/10/15 0:23:08

pb_ds 简介 与 使用

Part1

pb_ds 是一个基于策略的模板库

pb_ds 库封装了很多数据结构,比如哈希(Hash)表,平衡二叉树,字典树(Trie 树),堆(优先队列)等。

就像 vectorsetmap 一样,其组件均符合 STL 的相关接口规范。部分(如优先队列)包含 STL 内对应组件的所有功能,但比 STL 功能更多。

注意 pb_ds 只在使用 libstdc++ 为标准库的编译器下可以用。

由于 pb_ds 库的主要内容在以下划线开头的 __gnu_pbds 命名空间中,在 NOI 系列活动中的合规性一直没有确定。

2021 年 9 月 1 日,根据 《关于 NOI 系列活动中编程语言使用限制的补充说明》,允许使用以下划线开头的库函数或宏(但具有明确禁止操作的库函数和宏除外),在 NOI 系列活动中使用 pb_ds 库的合规性有了文件上的依据。

以上内容主要来自 OIwiki

pb_ds 包含的头文件有如下几个

#include <ext/pb_ds/assoc_container.hpp>  //容器库
#include <ext/pb_ds/tree_policy.hpp>      //各种树 
#include <ext/pb_ds/priority_queue.hpp>   //优先队列
#include <ext/pb_ds/hash_policy.hpp>       //哈希表

Part2 平衡树

所需头文件

#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
__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 : 储存的元素类型,如果想要存储多个相同的 Key 元素,则需要使用类似于 std::pair 和 struct 的方法,并配合使用 lower_bound 和 upper_bound 成员函数进行查找

Mapped: 映射规则(Mapped-Policy)类型,如果要指示关联容器是 集合,类似于存储元素在 std::set 中,此处填入 null_type,低版本 g++ 此处为 null_mapped_type;如果要指示关联容器是 带值的集合,类似于存储元素在 std::map 中,此处填入类似于 std::map<Key, Value> 的 Value 类型

Cmp_Fn: 关键字比较函子,例如 std::less

Tag: 选择使用何种底层数据结构类型,默认是 rb_tree_tag。__gnu_pbds 提供不同的三种平衡树,分别是:
rb_tree_tag:红黑树,一般使用这个,后两者的性能一般不如红黑树
splay_tree_tag:splay 树
ov_tree_tag:有序向量树,只是一个由 vector 实现的有序结构,类似于排序的 vector 来实现平衡树,性能取决于数据想不想卡你

Node_Update:用于更新节点的策略,默认使用 null_node_update,若要使用 order_of_key 和 find_by_order 方法,需要使用 tree_order_statistics_node_update

Allocator:空间分配器类型 一般不用管


pb_ds 的平衡树 的成员函数
image
image

使用例子 构造一棵可以按元素排名查找的存储字符串的平衡树

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <bits/stdc++.h>
using namespace std;
__gnu_pbds::tree<std::string,                                  // key值__gnu_pbds::null_type,                        /*这是映射到的值,我们现在不需要,所以填null_type*/std::less<std::string>,                       /*比较规则,对于自己写的结构体,可以使用仿函数的形式*/__gnu_pbds::rb_tree_tag,                      /*树的类型 红黑树一般为最优*/__gnu_pbds::tree_order_statistics_node_update /*节点更新类型*/>  k;int main()
{int cnt = 0;k.insert("man");k.insert("what");k.insert("can");k.insert("i");k.insert("say");// 树上元素 {"can","i","man","say","what"}auto it = k.find("can");cout << *it << endl;it = k.find_by_order(0);//按排名查找 key 值cout << *it << endl;it = k.find_by_order(1);cout << *it << endl;it = k.find_by_order(2);cout << *it << endl;//输出结果//can//i//manint f=k.order_of_key("man");//按key值查找排名cout<<f<<endl;//输出结果 2for(auto kk=k.begin();kk!=k.end();kk++)//用迭代器遍历{cout<<(*kk)<<" ";}//输出结果 can i man say whatreturn 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/52796.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

2024/08/25小记

给你看看AI实力: 问题:如果世界毁灭了人类应该怎么做?(科幻领域) Ai回答: 如果世界末日来临,人类应该采取以下措施: 紧急行动:疏散到安全地带:识别高点、避难所或其他受保护的区域,并立即疏散。 储备基本必需品:搜集足够的食物、水、药品、毯子和其他生存必需品。 保…

14-神经网络-参数管理

torch.rand和torch.randn的区别:

使用HF Trainer微调小模型

本文记录HugginngFace的Trainer各种常见用法。SFTTrainer的一个最简单例子 HuggingFace的各种Trainer能大幅简化我们预训练和微调的工作量。能简化到什么程度?就拿我们个人用户最常会遇到的用监督学习微调语言模型任务为例,只需要定义一个SFTrainer,给定我们想要训练的模型和…

题解:P10358 [PA2024] Obrazy

题解:P10358 [PA2024] Obrazy 题目传送门 即当最小的画框都不可能覆盖整个矩形墙面时,输出 −1。 [PA2024] Obrazy 题目背景 PA 2024 3C 题目描述 题目译自 PA 2024 Runda 3 Obrazy,感谢 Macaronlin 提供翻译 给定尺寸为 $h\times w$ 的矩形墙面,以及 $n$ 种尺寸的正方形画…

CMake构建学习笔记4-libjpeg库的构建

介绍了通过CMake构建libjpeg库的关键步骤。libjpeg是一个广泛使用的开源库,用于处理JPEG(Joint Photographic Experts Group)图像格式的编码、解码、压缩和解压缩功能,是许多图像处理软件和库的基础。 libjpeg本身的构建没什么特别的,不过值得说道的是libjpeg存在一个高性…

第一个selenium测试

一、环境搭建 使用语言:python 1、python解释器:python.exe 版本 3.11.4 下载地址:[https://www.python.org/downloads/release/python-3114/]设置环境变量:复制python.exe安装路径--高级系统设置--环境变量--PATH中添加--粘贴python.exe安装路径--确定 目的是确保接下来系…

博客园OpenApi管理平台

简介 博客园(Cnblogs)提供了OpenAPI服务,允许开发者通过API来获取博客园中的数据。使用这个API,可以实现从博客园抓取文章、评论等信息的功能,这对于想要集成博客园内容到自己网站或应用的开发者来说是非常有用的。 网址 https://api.cnblogs.com/结束

【论文阅读】TBA Faster Large Language Model Training Using SSD Based Activation Offloading

摘要 GPU内存容量的增长速度跟不上大型语言模型(llm)的增长速度,阻碍了模型的训练过程。特别是,激活——在前向传播过程中产生的中间张量,并在后向传播中重用——主导着GPU内存的使用。为了应对这一挑战,我们建议TBA将激活有效地卸载到高容量NVMe ssd上。这种方法通过自适应…