基于红黑树的有序集合,find_by_order
获取指定排名的键,order_of_key
获取指定键的排名。排名从0开始索引。
不支持重复键,可以采用pair类型做键,第二字段作为区分。
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
// 泛型定义,Mapped默认为null_type(即作为set使用)
template <typename Key, typename Mapped = null_type>
using ordered_map = tree<
Key,
Mapped,
std::less<Key>,
rb_tree_tag,
tree_order_statistics_node_update>;
// As a set
ordered_map<int> os;
os.insert(3); os.insert(1); os.insert(4);
auto it = os.find_by_order(1); // Points to element with rank 1 (value 3)
int rank = os.order_of_key(3); // Returns 1 (0-indexed rank of 3)
// As a map
ordered_map<int, string> om;
om[3] = "three"; om[1] = "one";