Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP.doc
Скачиваний:
7
Добавлен:
25.04.2019
Размер:
1.34 Mб
Скачать

InputIterator find(InputIterator first, InputIterator last, const t & value);

Шаблон find принимает два входных итератора first и last, которые указывают диапазон поиска в контейнере; третий параметр позволяет передать искомое значение. Возвращаемое значение – итератор на найденный элемент или past-the-end-итератор (тот, что возвращается компонентной функцией end контейнеров), если элемент отсутствует. Необходимо отметить, что для успешного применения алгоритма find тип (класс) T должен определять операцию operator==. Определение шаблона find приведено ниже.

template <class InputIterator, class T>

InputIterator find(InputIterator first, InputIterator last, const t & value)

{

while (first != last && *first != value) ++first;

Return first;

}

Алгоритм find имеет несколько полезных модификаций, которые позволяют задавать иные правила и/или порядок поиска. Так, алгоритм find_linear реализует линейный поиск. Алгоритм find_if выполняет условный поиск, правило сравнения элементов в котором задает предикат pred, устанавливаемый параметром шаблона. Определение find_if имеет следующий вид:

template <class InputIterator, class Predicate>

InputIterator find_if(InputIterator first, InputIterator last, Predicate pred)

{

while (first != last && !pred(*first)) ++first;

return first;

}

Предикат pred представляет собой функтор. Условие поиска считается выполненным, если справедливо pred(*i) == true, где i – итератор в диапазоне [first,last).

Пример использования find_if:

template <class T>

class find_first_greater { // определение функтора

public:

find_first_greater() : x(0) {} // конструктор по умолчанию

// конструктор копирования

find_first_greater(const find_first_greater& xx) : x(xx) {}

// операция функционального вызова

int operator() (const T& v) { return v > x; }

private:

T x;

};

...

vector<int> v;

// заполнение вектора числами 1 2 3 4 5

...

vector<int>::iterator i =

find_if(v.begin(), v.end(), find_first_greater<int>(3));

i != v.end()? cout << *i : cout << "not found";

...

В примере в контейнере v ищется первое значение, превышающее 3. Правило поиска при этом определяет функтор find_first_greater. Пока find_first_greater<int>(3) дает ложное значение, поиск продолжается; при истинном значении поиск останавливается на элементе со значением 4.

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

К числу других алгоритмов рассматриваемой категории относятся count (подсчет числа заданных значений в контейнере), count_if (подсчет числа значений контейнера, удовлетворяющих заданному условию), mismatch (поиск позиции первого несовпадения объектов двух контейнеров по заданному условию), equal (сравнение содержимого двух контейнеров по заданному правилу сравнения) и т.д.

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

template <class InputIterator, class OutputIterator>

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]