Re: std::unique specification vs. reality
"Jordan DeLong" <fracture@allusion.net> skrev i meddelandet
news:20060530200127.GA336@allusion.net...
I noticed the other day at work that std::unique(It,It,Pred) is
specified to remove each element of the sequence where the return of
pred(*i, *(i - 1)) is false, leaving only the first element in the
non-unique sub-sequence.
However, both the MSVC and G++ STL's do not do this. They compare
each element against the first element of the non-unique
sub-sequence,
not against the element preceding it.
As they all compare equal, we can't really tell which is which, can
we?
This changes the results (and
actually is what I want---but since it appears to be nonstandard, I
did not want to rely on that implementation).
For example (untested):
template<class T>
bool
within_threshold(T a, T b, T t)
{
return std::abs(a - b) < t;
}
I don't think this is a valid predicate for std::unique.
As I understand it, an "equivalence relation" implies that if
pred(a,b)==true and pred(b,c)==true, then pred(a,c) must also be true.
In your case, this doesn't hold for 0.92, 1.0, and 1.05.
vec.erase(
std::unique(vec.begin(), vec.end(),
boost::bind(&within_threshold<double>, _1, _2, 0.09)),
vec.end());
Bo Persson
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]