С++ для начинающих




Параметры и тип возврата - часть 2


Цикл for(;;) проводит разделение (строки 10-17). На каждой итерации цикла индекс low увеличивается до первого элемента, большего или равного elem (строка 11). Аналогично high уменьшается до последнего элемента, меньшего или равного elem (строка 12). Когда low становится равным или большим high, мы выходим из цикла, в противном случае нужно поменять местами значения элементов и начать новую итерацию (строки 14-16). Хотя элементы разделены, elem все еще остается первым в массиве. swap() в строке 19 ставит его на место до рекурсивного вызова sort() для двух частей массива.

Сравнение производится вызовом функции, на которую указывает compare (строки 11-12). Чтобы поменять элементы массива местами, используется операция swap() с аргументами типа string, представленная в разделе 6.11.

Вот как выглядит main(), в которой применяется наша функция сортировки:

#include <iostream>

#include <string>

// это должно бы находиться в заголовочном файле

int lexicoCompare( const string &, const string & );

int sizeCompare( const string &, const string & );

typedef int (*PFI)( const string &, const string & );

void sort( string *, string *, PFI=lexicoCompare );

string as[10] = { "a", "light", "drizzle", "was", "falling",

                  "when", "they", "left", "the", "museum" };

int main() {

    // вызов sort() с значением по умолчанию параметра compare

    sort( as, as + sizeof(as)/sizeof(as[0]) - 1 );

   // выводим результат сортировки

   for ( int i = 0; i < sizeof(as)/sizeof(as[0]); ++i )

       cout << as[ i ].c_str() << "\n\t";

}

Результат работы программы:

"a"

"drizzle"

"falling"

"left"

"light"

"museum"

"the"

"they"

"was"

"when"

Параметр функции автоматически приводится к типу указателя на функцию:




Содержание  Назад  Вперед