How can I get relative index of std::set?

Viewed 390

I've faced one problem recently. I want to get the relative index of std::set element. For example, if std::set stores {1, 2, 4, 6, 9, 15}, and I want to find element {4} and get its relative index {2} efficiently. Of course, I can write std::distance(myset.begin(), myiterator), but the complexity of this operation is O(n*logn). If I had access to real red-black tree of std::set, I would just run rb_tree_node_pos(see below), which is O(logn).That is exactly the relative index. Does anyone know how can I get real tree? Here's code example:

#include <iostream>
#include <set>
using namespace std ;
int rb_tree_node_pos(rb_tree_node *node) {
  //function that finds relative index of tree node
  if (node->parent==NULL) return rb_tree_size(node->left) ;
  else return rb_tree_node_pos(node->parent)+rb_tree_size(node->left)+1 ;_
}
int main () {
  set<int> myset ;
  //... reading some data in myset
  int find_int ;
  cin >> find_int ;
  set<int>::iterator myit=myset.find(find_int) ;
  int find_index=distance(myset.begin(), myit) ; // O(n*log(n)), to slow!!!
  find_index=rb_tree_node_pos(myit->get_rb_tree()) ; // that's O(logn)
  cout << find_index << endl ;
  return 0 ;
}

In general I want data structure that will maintain following operations: 1. insert element, 2. delete element, 3.print out relative index of element. I think there is a way to 'dig' it from STL.

2 Answers
Related