首页 > 其他分享 >魔法之 pb_ds

魔法之 pb_ds

时间:2024-08-25 11:05:33浏览次数:3  
标签:std __ 魔法 tree pb include ds

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
    //man
    int f=k.order_of_key("man");//按key值查找排名
    cout<<f<<endl;
    //输出结果 2
    for(auto kk=k.begin();kk!=k.end();kk++)//用迭代器遍历
    {
        cout<<(*kk)<<" ";
    }
    //输出结果 can i man say what
    return 0;
}

标签:std,__,魔法,tree,pb,include,ds
From: https://www.cnblogs.com/sea-and-sky/p/18378721

相关文章

  • 【书生·浦语实战营】进阶岛第6关:MindSearch CPU-only 版部署
    文章目录任务目标学习内容1.创建开发机&环境配置[CondaError:Runcondainit'before'condaactivate']报错解决[ERROR:Couldnotopenrequirementsfile:[Errno13]Permissiondenied:'/root/mindsearch/Mindsearch/requirements.txt]报错解决2.获取硅基流动APIK......
  • Infor CloudSuite软件二次开发:InforCloudSuite业务流程定制
    InforCloudSuite软件二次开发:InforCloudSuite业务流程定制InforCloudSuite简介InforCloudSuite平台概述InforCloudSuite是一个集成的企业资源规划(ERP)解决方案,专为特定行业设计,提供了一系列的云应用,旨在优化业务流程,提升运营效率。该平台融合了先进的技术,如人工智......
  • CF241B Friends 题解
    是异或粽子的超级加强版,但是本题因为\(m\)很大,不能套用那一题的解法。换一种思路:考虑把\(a_i\)从高位到低位插入0-1Trie之后,二分第\(m\)大,通过第\(m\)大求答案。对于二分的一个值\(x\),枚举每个位置\(i\),在0-1Trie上找与\(a_i\)异或值大于等于\(x\)的值的......
  • 轻松获得ADSL代理服务
    ADSL代理服务接入常见问答在当今激烈的网络爬虫与反爬虫斗争中,各大网站和应用程序采取的风险管理手段愈加严格,其中最常见的一种措施是IP封禁。为了有效应对IP封禁带来的挑战,设置代理服务成为一种非常有效的解决方案。配置完代理后,爬虫可以通过代理IP来隐藏真实IP,......
  • Swift 中的动画魔法:Core Animation 深度解析
    标题:Swift中的动画魔法:CoreAnimation深度解析引言在现代应用程序开发中,动画不仅增加了用户界面的吸引力,还提升了用户体验。Swift语言结合了CoreAnimation框架,为开发者提供了强大的工具来创建平滑和复杂的动画效果。本文将深入探讨如何在Swift中使用CoreAnimati......
  • Autel DS900 vs DS808 vs MP808 vs MS906
    Whatisthedifferenceamong2024AutelnewMaxiDASDS900series,DS808andMP808series?Herearesomecomparisontablets.Tablet1:AutelMaxiDASDS900vsDS900BTvsDS900TSModelMaxiDASDS900TSMaxiDASDS900BT MaxiDASDS900ReadCodes√√√E......
  • 浅谈 pb_ds 库
    大部分是在wiki搬运的,只是方便我看简介pb_ds库封装了很多数据结构,比如哈希(Hash)表,平衡二叉树,字典树(Trie树),堆(优先队列)等。就像vector、set、map一样,其组件均符合STL的相关接口规范。部分(如优先队列)包含STL内对应组件的所有功能,但比STL功能更多。可以使用begin()和e......
  • D. Determine Winning Islands in Race
    https://codeforces.com/contest/1998/problem/D思路:求出到达每个点的最短路径,然后从每个点i考虑跳跃到点j(i->j有边),i+1默认为必胜态,则必败态为j-从1~j的步数。如果必败态所在的位置>必胜态,则更新差分数组,最后求和即可。总结:一开始只考虑了从1~j的步数只能是1步1步走的,没考虑......
  • 【408DS算法题】022基础-递增输出单链表中的结点值
    Index题目分析实现总结以上内容稍后补全,以下内容来自https://blog.csdn.net/weixin_60702024/article/details/141336041题目分析实现总结分析题目给定单链表的头结点,按照递增的顺序,输出单链表结点的值。分析实现具体实现如下:总结注意delete执行后,只会将......
  • Towards Mitigating ChatGPT’s Negative Impact on Education: Optimizing Question
    文章目录题目摘要引言概述实验结果结论和未来工作题目减轻ChatGPT对教育的负面影响:通过布鲁姆分类法优化问题设计论文地址:https://ieeexplore.ieee.org/document/10223662摘要    生成文本AI工具在回答问题方面的流行引发了人们对其可能对学生学业成......