基于红黑树的有序集合,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";