📜  有序集和GNU C++ PBDS(1)

📅  最后修改于: 2023-12-03 15:40:17.886000             🧑  作者: Mango

有序集和GNU C++ PBDS

有序集是一种数据结构,可以快速添加、删除和查询元素,并且支持按照元素大小顺序进行操作。GNU C++ PBDS是一个C++标准库的替代品,它实现了很多STL中没有的数据结构,包括有序集。

PBDS 库的介绍

PBDS是一种利用STL完美生成思想的数据结构库,它基于平衡树实现了很多有趣的数据结构,如下:

  • rb_tree_tag
  • splay_tree_tag
  • ov_tree_tag
  • pat_trie
  • gp_hash_table

其中,rb_tree_tag就是红黑树,而ov_tree_tag则是基于顺序统计量的平衡树。而splay_tree_tagov_tree_tag都是"可并堆"的实现,可以支持合并和分离两种操作。

另外,PBDS还提供了一些其他的容器,如哈希表,如下:

  • direct_mask_range_hashing
  • chaining_hash_table
  • gp_hash_table

其中,gp_hash_table是pbds库自己的一种哈希表的实现。

使用 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库将是你十分不错的选择。