Блог пользователя shanto_bangladesh

Автор shanto_bangladesh, история, 3 года назад, По-английски

I tried to find the index of the upper_bound of an integer in a set.

set<int> s = {1,2,3,4,5};
int ind = s.upper_bound(2) - s.begin();
cout << ind << "\n";

But it's showing error. I did similar thing with vectors previously. Code looks like the following:

vector<int> v = {1,2,3,4,5};
int ind = upper_bound(v.begin(), v.end(), 2) - v.begin();
cout << ind << "\n;

The above code nicely executes the desired task. Why it's not working for set and multiset and what to do if we want to do the same task with a set or multiset without traversing the whole set?

Thanks for your patience!

  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

»
3 года назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится

std::set (or multiset, doesn't matter) doesn't allow you to do it fast. To calculate the index you should think of easier solution for the problem that doesn't involve it; it's too difficult use some more advanced data structures, for example ordered_set (see here). But actually, pay attention to the striked text!

»
3 года назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится

What you are using are are containers. Set, vector, map etc. There are linear containers and there are non-linear containers. Vector is a linear container and so you can subtract the iterators whereas set is non-linear container and you cannot do that.

»
3 года назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Pointers in std::set are only bidirectional iterators: this means that a std::set "pointer" can only go one step forward or one step backward in the set, no random jumps allowed and this also means no pointer addition/subtraction.