Three possible approaches:
- Use
std::unique
to create a temporary collection of unique values. This might make the code a little more readable, but less efficient. - Advance your iterator by using
std::multiset::upper_bound
rather than increments:for( auto each = a.begin(); each != a.end(); each=a.upper_bound(*each))
- that way you don't need theif
check insider your loop, plus it is guaranteed to be logarithmic in size. Pretty cool (didn't know that before I looked it up). For the following suggestion, all credit goes to @MarkRansom: Usingstd::upper_bound
from<algorithm>
, you can specify a range in which to look for the upper bound. In your case, you already have a good candidate for the start of that range, so this method is likely to be more efficient, depending on the implementation in your standard library. - If this is a real performance problem for you and the previous solution still isn't good enough, consider switching to
map<thing, unsigned>
or evenunordered_map<thing,unsigned>
where theunsigned
just keeps track of the number of equivalentthing
s you have. That implies rewriting your insertion/deletion code though.