Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
###Cpp_лкц1_1.09_11_#дляБАК#29_01_12.doc
Скачиваний:
40
Добавлен:
29.04.2019
Размер:
6.42 Mб
Скачать

Глава 14. Алгоритмы

351

fill, fill_n

Алгоритм fi 11 выполняет замену всех элементов последовательности, определенной с помощью итераторов first и last, заданным значением value. Алгоритм fillji выполняет замену п элементов заданным значением:

tempiate<class For, class T>

void fill(For first. For last, const T& value); tempiate<class Out, class Size, class T>

void fill_n(0ut first. Size n. const Т& value);

Рассмотрим пример заполнения целочисленного массива:

#include <iostream> #include <algorithm> using namespace std; int main(){

int a[5]. i;

fill (a, a + 5. 1);

for (i = 0; i < 5; i++) cout « a[i]: //11111

cout « endl;

fillji (a + 2, 2. 0);

for (i = 0; i < 5; i++) cout « a[i]; // 1 1 0 0 1

cout « endl;

return 0;

}

Обратите внимание на то,.что для списков мы не можем пользоваться выражением типа fill (а. а + 5, 1);, поскольку операция сложения для итераторов списка не определена. Если нам не известен итератор на конец заполняемой последовательности, можно воспользоваться второй формой алгоритма.

generate, generate_n

Алгоритм generate выполняет замену всех элементов результатом операции. Это позволяет заполнить контейнер не одинаковыми значениями, а вычисленными с помощью функции или функционального объекта gen, заданного третьим параметром.

tempiate<class For. class Generator

void generate(For first. For last. Generator gen); tempiate<class Out. class Size, class Generator

void generate_n(Out first, Size n, Generator gen);

Простой пример:

#include <iostream> #include <algorithm> using namespace std; int f(){

static int i = 1;

return (++i) * 3;

352

Часть III. Стандартная библиотека

}

int main(){ int a[5]. i; generate(a, a + 5. f);

for (i = 0; i<5; i++) cout « a[i] « " "; // 6 9 12 15 18 return 0;

} .

iter_swap, swap, swap_ranges

Алгоритм iter_swap выполняет обмен местами двух элементов, заданных итераторами:

tempiate<class Forl, class For2> void iter_swap(Forl a. For2 b);

Алгоритм swap выполняет обмен местами двух элементов:

• tempiate<class T> void swap(T& a. T& b);

Алгоритм swap_ranges выполняет обмен местами элементов в двух указанных диапазонах (для второго диапазона задано только его начало):

tempiate<class Forl, class For2>

For2 swap_ranges(Forl firstl. Forl lastl. For2 first2):

random_shuffle

Алгоритм random_shuffle выполняет перемещение (перетасовку) элементов в соответствии со случайным равномерным распределением. Третьим параметром алгоритма можно задать генератор случайных чисел. Это позволяет получать разные результаты при каждом запуске программы. Генератор может быть функцией или функциональным объектом, получающим аргумент п типа i nt и возвращающим целое число в диапазоне от 0 до п.

tempiate<class Ran>

void random_shuffle(Ran first, Ran last): tempiate<class Ran, class RandomNumberGenerator>

void random_shuffle(Ran first, Ran last, RandomNumberGenerator&, rand):

В примере в генераторе использована функция rand, объявленная в заголовочном файле <time.h>:

#include <iostream> #include <algorithm> #include <time.h> using namespace std: struct random_gen{

random_gen(){srand((unsigned int)time(NULU): }

int operator()(int n){return randO % n:}

}:

int main(){