📅  最后修改于: 2023-12-03 14:59:50.557000             🧑  作者: Mango
C++ 中的 PBDS(Policy Based Data Structures)是一个非常有用的库,它提供了一些高度定制的数据结构,以便程序员可以根据自己的需求来选择使用。在本文中,我们将详细介绍 PBDS 的使用。
PBDS 可以通过以下命令安装:
sudo apt-get install libstdc++-pbds-dev
如果你使用的是 Windows,可以将该库作为 Visual Studio 的插件安装。
PBDS 支持以下数据结构:
接下来我们将具体介绍每个数据结构以及它们的使用方法。
PBDS 支持以下几种平衡树:
平衡树的使用与标准库中的使用方法类似,只需要引入 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 是一个方便易用的库,它支持多种高度定制的数据结构,程序员可以根据自己的需求选择使用。本文中我们介绍了平衡树、哈希表和并查集三种数据结构的使用方法,在实际使用中,它们可以帮助我们快速解决很多问题。