📅  最后修改于: 2023-12-03 15:40:17.886000             🧑  作者: Mango
有序集是一种数据结构,可以快速添加、删除和查询元素,并且支持按照元素大小顺序进行操作。GNU C++ PBDS是一个C++标准库的替代品,它实现了很多STL中没有的数据结构,包括有序集。
PBDS是一种利用STL完美生成思想的数据结构库,它基于平衡树实现了很多有趣的数据结构,如下:
其中,rb_tree_tag
就是红黑树,而ov_tree_tag
则是基于顺序统计量的平衡树。而splay_tree_tag
和ov_tree_tag
都是"可并堆"的实现,可以支持合并和分离两种操作。
另外,PBDS还提供了一些其他的容器,如哈希表,如下:
其中,gp_hash_table
是pbds库自己的一种哈希表的实现。
PBDS库中的有序集被称为tree
容器。以下是一个PBDS库实现的有序集的例子。
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> s;
int main()
{
s.insert(1);
s.insert(3);
s.insert(4);
s.insert(10);
s.insert(11);
cout << *s.find_by_order(1) << endl; // 3
cout << s.order_of_key(5) << endl; // 2
return 0;
}
这个有序集是利用pbds
命名空间中的tree
模板类实现的。其中,模板参数解释如下:
int
表示存储的元素类型。null_type
表示使用普通红黑树。less<int>
表示使用less<int>
进行元素大小比较。rb_tree_tag
表示使用红黑树实现有序集。tree_order_statistics_node_update
表示使用有序统计量来进行节点更新。上述代码中tree
模板类支持以下成员函数:
find_by_order(x)
:返回迭代器,指向有序集中第x
小的元素。order_of_key(x)
:返回有序集中元素x
的排名。如果不存在,返回应该插入的位置。PBDS库是一个十分强大和有趣的C++数据结构库,它可以帮助程序员轻松实现各种不同的数据结构,如有序集、哈希表和可并堆等等。如果你需要高效地处理各种数据结构,使用PBDS库将是你十分不错的选择。