Robert said:
Hi all,
I have a Set contain several elements.
I want to do:
(1) Select one element from Set randomly;
(2) Delete this element from Set;
(3) If Set!=empty, goto(1);else, end.
Is there any easy approach?
#include <iostream>
#include <iterator>
#include <set>
#include <stdlib.h>
#include <string>
#include <time.h>
void show(const std::set<int>& s, const std::string prefix)
{
std::set<int>::const_iterator it(s.begin());
std::set<int>::const_iterator en(s.end());
std::cout << prefix;
while(it != en)
std::cout << *it++ << '\n';
std::cout.put('\n');
}
int rand_range(int lo, int hi)
{
return lo +
(int)((double)rand() /
((double)RAND_MAX + 1) * (hi - lo + 1));
}
int main()
{
srand((unsigned int)time(0));
std::set<int> s;
for(std::set<int>::size_type i = 0; i < 10; ++i)
s.insert(i);
show(s, "Initial values:\n");
while(!s.empty())
{
std::set<int>::iterator it(s.begin());
std::advance(it, rand_range(0, s.size() - 1));
int i = *it;
s.erase(it);
std::cout << i << " deleted\n\n";
show(s, "Current values:\n");
}
return EXIT_SUCCESS;
}
Of course the end result could be achieved much more
succintly:
s.clear();
-Mike