Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Element at index in a std::set?

Tags:

c++

std

set

I've stumbled upon this problem: I can't seem to select the item at the index' position in a normal std::set. Is this a bug in STD?

Below a simple example:

#include <iostream> #include <set>  int main() {     std::set<int> my_set;     my_set.insert(0x4A);     my_set.insert(0x4F);     my_set.insert(0x4B);     my_set.insert(0x45);      for (std::set<int>::iterator it=my_set.begin(); it!=my_set.end(); ++it)         std::cout << ' ' << char(*it);  // ups the ordering      //int x = my_set[0]; // this causes a crash! } 

Anything I can do to fix the issue?

like image 990
hauron Avatar asked Dec 09 '13 18:12

hauron


People also ask

Does set have index in C++?

The boolean value denotes if index is found the set or not. The integer value contains the integer stored at index in the set. If the boolean value is set true, which indicates index to be a valid index, print the integer value stored in the pair.

Can set be accessed by index?

You can't access set using index but the above method would provide an "index" i if you want to copy the elements from set into an array, provided you have created an array of sufficient size before hand.


1 Answers

It doesn't cause a crash, it just doesn't compile. set doesn't have access by index.

You can get the nth element like this:

std::set<int>::iterator it = my_set.begin(); std::advance(it, n); int x = *it; 

Assuming my_set.size() > n, of course. You should be aware that this operation takes time approximately proportional to n. In C++11 there's a nicer way of writing it:

int x = *std::next(my_set.begin(), n); 

Again, you have to know that n is in bounds first.

like image 117
Steve Jessop Avatar answered Oct 11 '22 02:10

Steve Jessop