Это немного неловко, но если вы проверите определения lower_bound
и upper_bound
из стандарта, вы увидите, что определение lower_bound
ставит разыменованный итератор как first параметр сравнения (и значение second), тогда как upper_bound
помещает разыменованный итератор second (и значение first).
Итак, я не проверял это, но думаю, вы захотите:
std::lower_bound(vec.begin(), vec.end(), 3.142, [](const MS &lhs, double rhs) {
return lhs.aT < rhs;
});
и
std::upper_bound(vec.begin(), vec.end(), 3.142, [](double lhs, const MS &rhs) {
return lhs < rhs.aT;
});
Это довольно неприятно, и, не отыскивая еще несколько вещей, я не уверен, что вы на самом деле вправе предполагать, что реализация использует компаратор только так, как он описан в тексте - это определение результата , а не средства, чтобы добраться туда. Это также не помогает с binary_search
или equal_range
.
В 25.3.3.1 прямо не указано, что тип значения итератора должен быть конвертируемым в T, но это в некотором роде подразумевается тем фактом, что для алгоритма требуется, чтобы T (в этом случае double
) должно быть LessThanComparable, за исключением того, что T должен быть сопоставим с типом значения итератора в любом конкретном порядке.
Так что я думаю, что лучше просто использовать лямбду (или функтор), которая сравнивает две структуры MS, и вместо того, чтобы передавать значение типа double в качестве значения, передайте фиктивную MS с правильным полем, установленным на значение, которое вы ищете для:
std::upper_bound(vec.begin(), vec.end(), MS(3.142,0,0), [](const MS &lhs, const MS &rhs) {
return lhs.aT < rhs.aT;
});
Если вы не хотите давать MS конструктор (потому что вы хотите, чтобы он был POD), тогда вы можете написать функцию для создания вашего объекта MS:
MS findA(double d) {
MS result = {d, 0, 0};
return result;
}
MS findB(double d) {
MS result = {0, d, 0};
return result;
}
Действительно, теперь, когда есть лямбды, для этой работы нам нужна версия бинарного поиска, которая использует унарный «компаратор»:
double d = something();
unary_upper_bound(vec.begin(), vec.end(), [d](const MS &rhs) {
return d < rhs.aT;
});
C ++ 0x этого не обеспечивает.