![](https://csdnimg.cn/release/download_crawler_static/10488818/bg3.jpg)
3 TREE-LIKE CONTAINERS (TREES AND TRIES)
t.insert("ebc");
t.insert("basicmap");
assert(t.find("basicmap") != t.end());
t.erase("basicmap");
for (Tree::const_iterator i = t.begin(); i != t.end(); ++i) {
printf("%s\n", i−>c_str());
}
exit(EXIT_SUCCESS);
}
3 Tree-Like Containers (Trees and Tries)
3.1 区间第 K 大值
pb_ds 中的 tree 非常实用的功能就是能够在树中查询第 K 大的元素是多少,并且可以查询一个
给定的元素在树中是第几大的,相关的三个函数如下:
inline const_iterator find_by_order(size_type order) const
inline iterator find_by_order(size_type order)
inline size_type order_of_key(const_key_reference r_key) const
其中,find_by_order 的作用是查找第 order 大的元素并返回指向它的迭代器,order_of_key 的作
用则是查找给定的 r_key 元素在树中是第几大的,两者的编号都从 0 开始。
一个简短的例子(注意 typedef):
#include <cassert>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef tree<int, null_mapped_type, less<int>, rb_tree_tag,
tree_order_statistics_node_update> set_t;
int main() {
set_t s;
s.insert(12);
s.insert(505);
s.insert(30);
s.insert(1000);
s.insert(10000);
s.insert(100);
assert(*s.find_by_order(0) == 12);
assert(*s.find_by_order(1) == 30);
assert(*s.find_by_order(2) == 100);
assert(*s.find_by_order(3) == 505);
assert(*s.find_by_order(4) == 1000);
assert(*s.find_by_order(5) == 10000);
assert(s.find_by_order(6) == s.end());
3