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

Стандартные алгоритмы

Помимо контейнеров стандартная библиотека содержит большое количество алгоритмов (около 60). Алгоритм STL– это алгоритм в прямом смысле слова, т.е. некоторая операция, выполняемая над некоторыми данными. Все алгоритмы обрабатывают данные представленные в виде последовательности, заданной двумя итераторами. Это означает, что алгоритмыSTLмогут обрабатывать как содержимое стандартных контейнеровSTL, так и нестандартных (но совместимых с ними), а также любой последовательности представленной паройSTLсовместимых итераторов.

Преимущество данного подхода заключается в том, что реализация алгоритма не содержит никакой информации о структуре обрабатываемых данных, помимо того, что они являются последовательностью. Все алгоритмы являются шаблонами функции и могут быть применены к различным типам аргументов. Так например, с помощью рассмотренного в одной из предыдущих работ алгоритма copy, можно скопировать содержимое одного контейнера в другой, или прямо на стандартный вывод, передав в качестве третьего параметра (итератор, указывающий последовательность, в которую осуществляется копирование) итератор вывода в стандартный поток.

// программа выводит латинский алфавит

#include "stdafx.h"

#include <vector>

#include <iterator>

#include <iostream>

using namespace std;

int main (int, char**)

{

vector<char> VectorOfInt;

int i;

for (i = 0; i < 26; i++)

{

VectorOfInt.push_back('a' + i);

VectorOfInt.push_back(' ');

}

copy(VectorOfInt.begin(),

VectorOfInt.end(),

ostream_iterator<char>(cout));

return 0;

}

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

Объявления всех стандартных алгоритмов находится в заголовочном файле <algorithm>

Обрабатываемые последовательности

Необходимо отметить, что всестандартные алгоритмы, принимают в качестве обрабатываемой последовательности, последовательность вида [iterator_first;iterator_last), гдеiterator_first– итератор указывающий на первый элемент последовательности,iterator_last– итератор, указывающий на элемент последовательности, следующий за последним (законечный элемент).

Также необходимо отметить, что алгоритмы не осуществляют проверку переданных им данных, т.е. переданные стандартным алгоритмам последовательности должны быть действительными, iterator_lastдолжен быть достижим изiterator_firstза конечное (возможно нулевое) число шагов. В случае если последовательность является недопустимой, поведение программы не определено.

vector<int> vec1(10); // вектор из 10 элементов

vector<int> vec2(100); // вектор из 10 элементов

// [ vec1.begin()+5; vec1.begin() ) – недопустимая последовательность,

// несмотря на то, что по отдельности итераторы действительны

// vec1.begin() недостижим из vec1.begin() + 5

copy(vec1.begin()+5, vec1.begin(),vec2.begin());

// [ vec1.begin()+50; vec1.end() ) – недопустимая последовательность,

// vec1.begin()+50 – недействительный итератор

copy(vec1.begin()+50, vec1.end(),vec2.begin());

// [ vec1.begin(); vec2.end() ) – недопустимая последовательность,

// итераторы принадлежат разным контейнерам

copy(vec1.begin(), vec2.end(), vec2.begin());

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

Некоторый алгоритмы выводят результаты своей работу в отдельную последовательность (например copy), заданную итераторомresult, указывающим на начало последовательности. В этом случае также необходимо, чтобы последовательность имела длину достаточную, чтобы вместить результаты работы алгоритма. Однако в этом случаем, если итераторresultотносится в категории итераторов вывода, может быть применен back_insert_iterator,front_insert_iteratorилиinsert_itertor.

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