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

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

353

int a[5] = {1. 2, 3. 4, 5}. i; random_shuffle(a. a + 5, random_gen()); for (i = 0; i < 5; i++) cout « a[i] «"";// 5 3 4 1 2 cout « endl; return 0; }

remove, removejf, remove_copy, remove_copy_if

Алгоритмы семейства remove выполняют перемещение в конец последовательности элементов с заданным значением value или по предикату pred. При этом оставшиеся элементы перемещаются в начало последовательности с сохранением их относительного порядка. Алгоритм возвращает границу их размещения. Элементы, расположенные после границы, не удаляются, размер последовательности не изменяется. Формы алгоритма, содержащие слово сору, перед обработкой копируют последовательность на место, заданное итератором Out, и обрабатывают копию последовательности.

tempiate<class For, class T>

For remove(For first, For last, const T& value); tempiate<class For. class Pred>

For remove_if(For first. For last. Pred pred); tempiate<class In, class Out. class T>

Out remove_copy(In first. In last.

Out result, const T& value); tempiate<class In. class Out. class Pred>

Out remove_copy_if(In first. In last, Out result. Pred pred);

Пример применения remove для удаления элементов вектора, значения которых равны 2:

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

vector<int> a;

int i;

for (i = 0; i < 5; i++) a.push_back(i);

for (i =0; i < 5; i++) a.push_back(i);

for (i = 0; i < a.sizeO; i++) cout « a[i];

cout « endl;

vector<int>;;iterator k. p = remove(a.begin(), a.endO. 2);

for (i = 0; i < a.sizeO; i++) cout « a[i];

cout « endl;

for (k = a.beginO; k != p; k++) cout « *k;

return 0;

}

354

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

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

0123401234 0134013434 01340134

Пример применения remove_if совместно с методом erase для удаления элементов вектора, значения которых лежат в пределах от 10 до 50:

#include <iostream>

#include <algorithm>

#include <vector>

using namespace std;

bool In_10_50 (int x) {return x > 10 && x < 50;}

int main(){

vector<int> a;

i nt i;

for (i = 1; i<10; i++) a.push_back(i*10);

for (i = 0: i<a.size(); i++) cout « a[i] « " ";

cout « endl;

vector<int>::iterator new_end = remove_if(a.begin(), a.endO, In_10_50):

a.erase(new_end. a.endO):

for (i = 0: i<a.size(); i++) cout « a[i] « " ":

cout « endl;

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

10 20 30 40 50 60 70 80 90 10 50 60 70 80 90

replace, replacejf, replace_copy, replace_copy_if

Алгоритмы семейства replace выполняют замену элементов с заданным значением на новое значение или в соответствии с предикатом. Формы алгоритма, содержащие слово сору, перед обработкой копируют последовательность на место, заданное итератором Out, и обрабатывают копию последовательности.

tempiate<class For, class T>

void replace(For first, For last.

const T& old_value, const T& new_value); tempiate<class For, class Pred. class T> void replacejf (For first, For last. Pred pred, const T& new_value): tempiate<class In, class Out, "class T>

Out replace_copy(In first, In last. Out result,

const T& old_value. const T& new_value); tempiate<class Iterator, class Out. class Pred. class T> Out replace_copy_if(Iterator first. Iterator last, Out result. Pred pred, const T& new_value);