📜  c++中的pbds(1)

📅  最后修改于: 2023-12-03 14:59:50.557000             🧑  作者: Mango

C++ 中的 PBDS

C++ 中的 PBDS(Policy Based Data Structures)是一个非常有用的库,它提供了一些高度定制的数据结构,以便程序员可以根据自己的需求来选择使用。在本文中,我们将详细介绍 PBDS 的使用。

安装 PBDS

PBDS 可以通过以下命令安装:

sudo apt-get install libstdc++-pbds-dev

如果你使用的是 Windows,可以将该库作为 Visual Studio 的插件安装。

PBDS 支持的数据结构

PBDS 支持以下数据结构:

  • 平衡树
  • 哈希表
  • 并查集

接下来我们将具体介绍每个数据结构以及它们的使用方法。

平衡树

PBDS 支持以下几种平衡树:

  • rb_tree_tag
  • splay_tree_tag
  • ov_tree_tag
  • pat_trie_tag
  • trie_policy

平衡树的使用与标准库中的使用方法类似,只需要引入 pbds 头文件并指定使用的标签即可。

以下是一个红黑树的示例代码:

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;

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(4);
    s.insert(8);
    s.insert(16);
    cout << s.order_of_key(8) << endl; // 输出 3,即有 3 个数小于 8
    cout << *s.find_by_order(2) << endl; // 输出 4,即排名为 2 的数为 4
    return 0;
}

其中,order_of_key(x) 返回比 x 小的元素个数,find_by_order(k) 返回排名为 k 的元素。

哈希表

PBDS 提供了使用哈希表的数据结构(除了可以使用标准库中的 map 以外),并且提供了多种哈希函数与哈希冲突处理方法。

以下是一个哈希表的示例代码:

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
using namespace __gnu_pbds;
using namespace std;

typedef cc_hash_table<int,bool> hash_table;

int main(){
    hash_table ht;
    ht[1] = true;
    ht[2] = false;
    cout << ht[1] << endl; // 输出 true
    cout << ht[2] << endl; // 输出 false
    return 0;
}
并查集

PBDS 还提供了可以使用并查集的数据结构。

以下是一个并查集的示例代码:

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/priority_queue.hpp>
using namespace __gnu_pbds;
using namespace std;

typedef priority_queue<pair<int,int>,less<pair<int,int>>,pairing_heap_tag> heap;

struct dsu{
    vector<int> fa;
    void init(int n){
        fa.resize(n+1);
        for(int i=1;i<=n;i++) fa[i] = i;
    }
    int find(int x){
        return fa[x]==x?x:fa[x]=find(fa[x]);
    }
    void unify(int x,int y){
        x = find(x),y = find(y);
        if(x!=y) fa[x] = y;
    }
    bool same(int x,int y){
        return find(x)==find(y);
    }
};

int main(){
    dsu d;
    heap h;
    int n,m;
    scanf("%d%d",&n,&m);
    d.init(n);
    for(int i=1,x,y,w;i<=m;i++){
        scanf("%d%d%d",&x,&y,&w);
        h.push(make_pair(w,(x-1)*n+y));
    }
    for(int i=1;i<=n*n;i++){
        int x = (h.top().second-1)/n+1,y = (h.top().second-1)%n+1;
        int w = h.top().first;
        h.pop();
        if(d.same(x,y)) continue;
        d.unify(x,y);
        printf("%d %d %d\n",x,y,w);
    }
    return 0;
}
总结

PBDS 是一个方便易用的库,它支持多种高度定制的数据结构,程序员可以根据自己的需求选择使用。本文中我们介绍了平衡树、哈希表和并查集三种数据结构的使用方法,在实际使用中,它们可以帮助我们快速解决很多问题。