Язык программирования C++. Вводный курс


Использование обобщенных алгоритмов - часть 4


/p>

}

Нужный результат при этом достигается, но эффективность существенно ниже, чем хотелось бы. less_than()

реализована в виде одной инструкции. Обычно она вызывается как встроенная (inline) функция. Но, передавая указатель на нее, мы не даем компилятору сделать ее встроенной. Способ, позволяющий добиться этого, –применение объекта-функции:

// объект-функция - операция реализована с помощью перегрузки

// оператора operator()

class LessThan {

public:

   bool operator()( const string & s1, const string & s2 )

                  { return s1.size() < s2.size(); }

};

Объект-функция – это класс, в котором перегружен оператор вызова operator(). В теле этого оператора и реализуется логика функции, в данном случае сравнение “меньше”. Определение оператора вызова выглядит странно из-за двух пар скобок. Запись

operator()

говорит компилятору, что мы перегружаем оператор вызова. Вторая пара скобок

( const string & s1, const string & s2 )

задает передаваемые ему формальные параметры. Если сравнить это определение с предыдущим определением функции less_than(), мы увидим, что, за исключением замены less_than на operator(), они совпадают.

Объект-функция определяется так же, как обычный объект класса (правда, в данном случае нам не понадобился конструктор: нет членов, подлежащих инициализации):

LessThan lt;

Для вызова экземпляра перегруженного оператора мы применяем оператор вызова к нашему объекту класса, передавая необходимые аргументы. Например:

string st1( "shakespeare" );

string st2( "marlowe" );

 

// вызывается lt.operator()( st1, st2 );

bool is_shakespeare_less = lt( st1, st2 );

Ниже показана исправленная функция process_vocab(), в которой алгоритму stable_sort()

передается безымянный объект-функция LessThan():

void process_vocab( vector<textwords, allocator> *pvec )

{

   // ...

   stable_sort( texts.begin(), texts.end(), LessThan() );

 

   // ...

}

Внутри stable_sort()




Начало  Назад  Вперед



Книжный магазин