сравните функцию для upper_bound / lower_bound

Пожалуйста, проверьте ниже.

cout << (*printart1)[i]<< endl;
13
задан Martin Beckett 15 May 2009 в 16:12
поделиться

3 ответа

Какую функцию вы передали алгоритму сортировки? Вы должны иметь возможность использовать один и тот же для 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;
    }
};

Как видите, это долгий путь.

17
ответ дан 1 December 2019 в 21:38
поделиться

Думаю, вам нужен std :: bind2nd (std :: less (), x) . Но, конечно, оператор <должен быть определен для MyClass.

Edit: о, и я думаю, вам понадобится конструктор для MyClass, который принимает только float, чтобы его можно было неявно преобразовать. Однако может быть лучший способ сделать это.

0
ответ дан 1 December 2019 в 21:38
поделиться

Вы можете еще больше улучшить решение Марка, создав статический экземпляр 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);

Это делает его немного более читабельным

8
ответ дан 1 December 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: