📅  最后修改于: 2023-12-03 15:10:38.346000             🧑  作者: Mango
有序集是一种基于平衡树的数据结构,支持快速的插入、删除和查找操作,并且可以方便地进行区间查询。而 GNU C++ PBDS (Policy-Based Data Structures) 是一个 C++ 库,提供了一些支持有序集等高效数据结构的数据结构实现。
相对于 STL 中的关联容器(如 map 和 multiset),PBDS 的有序集具有如下优势:
PBDS 库提供了以下支持有序集的数据结构类型:
其中,set 和 multiset 分别对应 STL 中的 set 和 multiset 容器,而 map 和 multimap 分别对应 STL 中的 map 和 multimap 容器。
下面是 pbds::set 类型的一些代码片段示例:
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
// 定义树节点类型
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
int main()
{
// 创建有序集
ordered_set s;
s.insert(1);
s.insert(2);
s.insert(3);
return 0;
}
int main()
{
ordered_set s;
s.insert(1);
s.insert(2);
s.insert(3);
// 查找第2小的元素
auto it = s.find_by_order(1);
assert(*it == 2);
return 0;
}
int main()
{
ordered_set s;
s.insert(1);
s.insert(2);
s.insert(3);
// 查找 2 的排名
assert(s.order_of_key(2) == 1);
return 0;
}
有序集和 GNU C++ PBDS 是一对很好的组合,可以为我们提供高效、灵活、易用的数据结构工具。虽然 PBDS 有一些学习和使用成本,但是只要掌握一些基本操作,就可以很容易地应用到实际问题中。