Пожалуйста, проверьте ниже.
cout << (*printart1)[i]<< endl;
Какую функцию вы передали алгоритму сортировки? Вы должны иметь возможность использовать один и тот же для upper_bound и lower_bound.
Самый простой способ заставить сравнение работать - создать фиктивный объект с ключевым полем, установленным на значение вашего поиска. Тогда сравнение всегда будет между похожими объектами.
Edit: Если по какой-то причине вы не можете получить фиктивный объект с правильным значением для сравнения, вы можете создать функтор сравнения. Функтор может предоставить три перегрузки для operator ():
struct MyClassLessThan
{
bool operator() (const MyClass & left, const MyClass & right)
{
return left.key < right.key;
}
bool operator() (const MyClass & left, float right)
{
return left.key < right;
}
bool operator() (float left, const MyClass & right)
{
return left < right.key;
}
};
Как видите, это долгий путь.
Думаю, вам нужен std :: bind2nd (std :: less
. Но, конечно, оператор <должен быть определен для MyClass.
Edit: о, и я думаю, вам понадобится конструктор для MyClass, который принимает только float, чтобы его можно было неявно преобразовать. Однако может быть лучший способ сделать это.
Вы можете еще больше улучшить решение Марка, создав статический экземпляр MyClassLessThan в MyClass
class CMyClass
{
static struct _CompareFloatField
{
bool operator() (const MyClass & left, float right) //...
// ...
} CompareFloatField;
};
Таким образом, вы можете вызвать lower_bound в следующим образом:
std::lower_bound(coll.begin(), coll.end(), target, CMyClass::CompareFloatField);
Это делает его немного более читабельным