Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
STL5 / lab6-algorithms / lab6-algorithms.doc
Скачиваний:
8
Добавлен:
10.04.2015
Размер:
203.26 Кб
Скачать

Алгоритмы модифицирующие последовательность Копировать (Copy)

template <class InputIterator, class OutputIterator>

OutputIterator copy(InputIterator first, InputIterator last,

OutputIteratorresult);

Алгоритм copyбыл рассмотрен в одной из предыдущих работ, он копирует3данные из одной последовательности заданной [first;last) в другую последовательность, начало, которой задано итераторомresult. Длинная «принимающей» последовательности должна быть достаточной, чтобы вмести все элементы исходной последовательности. Алгоритм возвращает итератор, указывающий на элемент следующий за последним скопированным элементом.

Обменять (Swap)

template <class T>

void swap(T& a, T& b);

swap– обменивает содержимым переменные, ссылки на которые передаются через аргументы.

tempate <class ForwardIterator1, class ForwardIterator2>

ForwardIterator2 swap_ranges(ForwardIterator1 first1,

ForwardIterator1 last1, ForwardIterator2 first2);

swap_range– обменивает местами содержимое двух последовательностей, первая последовательность задается парой итераторов [first1;last1), начало второй задается итераторомfirst2, вторая последовательность должна иметь длину по крайне мере не меньше чем первая. Необходимо отметить, что в данном случае не может быть использован итератор вставки, напримерback_insert_iterator, так как он является итератором вывода, аswap_rangeтребует, чтобы входные последовательности были заданы с помощью последовательных итераторов (последовательный итератор поддерживает операции не поддерживаемые итератором вывода), это объясняется тем, что необходимо в каждой последовательности читать и записывать элементы. Алгоритма возвращает итератор, указывающий на элемент, следующий за последним обработанным элементом во второй последовательности; или другими словами first2 + (last1 - first1).

Преобразовать (Transform)

template <class InputIterator, class OutputIterator, class Unary0peration>

OutputIterator transform(InputIterator first, InputIterator last,

OutputIterator result, UnaryOperation op);

template <class InputIterator1, class InputIterator2,

class OutputIterator, class Binary0peration>

OutputIterator transform(InputIterator1 first1, InputIterator1 last1,

InputIterator2 first2, OutputIterator result,

BinaryOperation binary_op);

transform– применяет функцию к элементам последовательности и записывает результат в другую последовательность.

Первый вариант применяет к каждому элементу последовательности [first;last) функциюopи присваивает результат вычисления этой функции последовательности, начало которой заданоresult.Отметим, что result может совпадать с first. Следующий пример показывает, как с помощьюtransformмодно увеличить все элементы вектора в два раза.

#include <algorithm>

#include <vector>

#include <iostream>

using namespace std;

int twice(int arg)

{

return arg*arg;

}

int main()

{

vector<int> v1;

v1.push_back(1);

v1.push_back(2);

v1.push_back(3);

v1.push_back(4);

v1.push_back(5);

int i;

for (i = 0; i < v1.size(); i++)

cout << v1[i] << ", ";

cout << endl;

transform(v1.begin(),v1.end(),v1.begin(),twice);

for (i = 0; i < v1.size(); i++)

cout << v1[i] << ", ";

cout << endl;

return 0;

}

Вывод программы:

1, 2, 3, 4, 5,

1, 4, 9, 16, 25,

Второй вариант transformприменяет двухаргументную функциюbin_opпоследовательно к парам элементов из первой и второй последовательности и результат записывает в третью последовательность. Входные последовательности заданы с помощью [first1;last2) и начала последовательностиfirst2, результат записывается в последовательность начало, которой задано итераторомresult. При этом длинны последовательностей заданныхfirst2 иresultдолжны быть не меньше длины последовательности заданной [first1;last1).resultможет совпадать вfirst1 илиfirst2. Типы элементов последовательностей могут не совпадать, ограничение является то, что функцияbinary_opдолжна принимать и возвращать данные правильного типа.

#include <algorithm>

#include <vector>

#include <list>

#include <iostream>

using namespace std;

double add(int arg1, double arg2)

{

return arg1 + arg2;

}

int main()

{

vector<int> v1;

v1.push_back(1);

v1.push_back(2);

v1.push_back(3);

v1.push_back(4);

v1.push_back(5);

list<double> l1;

l1.push_back(1);

l1.push_back(2);

l1.push_back(3);

l1.push_back(4);

l1.push_back(5);

l1.push_back(6);

l1.push_back(7);

l1.push_back(8);

l1.push_back(9);

vector<int>::iterator v_iter = v1.begin();

for (; v_iter != v1.end(); ++v_iter)

cout << *v_iter << ", ";

cout << endl;

list<double>::iterator l_iter = l1.begin();

for (; l_iter != l1.end(); ++l_iter)

cout << *l_iter << ", ";

cout << endl;

transform(v1.begin(),v1.end(),l1.begin(),l1.begin(),add);

l_iter = l1.begin();

for (; l_iter != l1.end(); ++l_iter)

cout << *l_iter << ", ";

cout << endl;

return 0;

}

Вывод программы:

1, 2, 3, 4, 5,

1, 2, 3, 4, 5, 6, 7, 8, 9,

2, 4, 6, 8, 10, 6, 7, 8, 9,

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

Обе версии алгоритма возвращают итератор, указывающий на элемент, следующий за последним обработанным элементом в результирующей последовательности, или другими словами first2 + (last1 - first1).

Соседние файлы в папке lab6-algorithms