Re: Problems removing an element from a std::set using a reverse_iterator
irotas <google@irotas.net> wrote:
There's one thing that I'm still not sure of. Is the method using a
reverse_iterator in the ERASE1 approach (see source code below)
actually incorrect? Does it violate the standard? Or is it just clumsy/
awkward?
... Quote
for(UIntSet::reverse_iterator ri = uis.rbegin() ;
ri != uis.rend() ;)
{
if((*ri) < THRESHOLD)
{
break;
}
uis.erase(--(ri.base()));
}
... end quote
looks ok since the enclosed interator is is not decremented
until after the erase has adjusteed the inards of the std::set, [during
*ri operation, ri. Not 100% certain.
As to why my use of iterator appears to be slower, beats me. As I
would guess that the iterator solution is at least as fast as a reverse
iterator solution, since it does not need the indirection used by
reverse iterator.
ERASE3 loops twice once to find the starting point to erase then in
erase(iterator,iterator) so it is likely to be slower than a single
loop.
<quote>
// easiest way to get the SFINAE class that tests for
// typedef ... key_type;
I haven't yet deciphered what all this means and how it applies to my
problem. I'll look at it again more this evening.
</quote>
Most existing compilers do not support iterator set::erase(iterator);
so one must determine how to erase from a general container with a
bidirectional iterator. Sorted associative containers have a nested
typedef for key_type, and sequenntial container do not.
erase in a loop with a sorted assoc. container
[set/mep/multiset/multimap] need to be done like this
erase(it++);
and most sequential containers require
it = erase(it);
so depending on the presence or not of a type C::key_type determines
which to use with generic code. Does this make any sense??
[latest draft does provide iterator erase(iterator) for all standard
provided sequence or sorted assoc. containers, but many compilers might
not yet so provide]
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]