I have a std::vector with the element as pair and need to find all the elements with the first component within some ranges, for example, to find all elements such that abs(value of first component – reference)<0.01, I got the code from other post that
bool comp(pair<double, double> v1, pair<double, double> v2)
{
return (abs(v1.first-v2.first)<0.001);
}
vector< pair<double, double> data;
for (int i=0; i<10; i++)
{
double a, b;
// a & b are initialized randomly (the code was not shown here)
data.push_back(make_pair(a, b));
}
// we sort the vector here based on the pair.first (code not shown)
// compval is used as reference value, i.e. we are going to find all elements with abs(pair.first-ref.first)<0.01
pair<double, double> ref
ref.first = 0.5;
ref.second = 0.5;
std::pair< vector< pair<double, double>::iterator, vector< pair<double, double>::iterator> const range = std::equal_range(data.begin(), data.end(), ref, comp);
but if you look at all elements given by the resulting ranges, you will see that all elements of the data instead of the one satisfying abs(pair.first-ref.first)<0.01 will be returned. Is that anything I miss in the code? Thanks.
equal_rangerequires a sorted range.The order implied by your comparison function does not match the order that you sorted the range into – and so the call to
equal_rangehas undefined behaviour.For example – say your list contained
{{.5, 0}, {.6, 0}}(these are sorted), and you then appliedstd::bind(comp({.5,.5},_1))to each element.comp({.5,.5},{.5,0})would return true.comp({.5,.5},{.6,0})would return false.Your sort order is saying: “
.5is less than.6“, but at the same time yourcompfunction is saying “.6is less than.5” (because a there is a value which is less than.5but not less than.6). This is contradictory, and the cause of your problems.To actually find all the elements such that
std::bind(comp({.5,.5}, _1))returns true, you could usestd::copy_if(data.begin(), data.end(), some_output_iterator, std::bind(comp(ref, std::placeholders::_1)))(although there are a variety of different ways of doing this, depending on your exact needs).