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

Алгоритмы поиска find, find_if, find_end, binary_search

В STL имеется несколько алгоритмов, выполняющих поиск в контейнере. Приводимая ниже программа демонстрирует возможности этих алгоритмов.

#include <vector>

#include <iostream>

#include <algorithm>

#define T int

using namespace std;

bool fun(T i){return i%2==0;}

int main()

{ T m1[]={5,3,4,7,3,12};

std::vector<T> v1(m1,m1+sizeof(m1)/sizeof(T));

std::ostream_iterator<T> out(cout," ");

std::vector<T>::iterator itr;

cout<<"вектор v1 : ";

std::copy(v1.begin(),v1.end(),out);

itr=std::find(v1.begin(),v1.end(),5);

cout<<"\nзначение 5 ";

if(itr!=v1.end()) cout<<"найдено в позиции "<<itr-v1.begin()<<endl;

else cout<<"не найдено\n";

itr=std::find_if(v1.begin(),v1.end(),fun);

if(itr!=v1.end()) cout<<"первый четный элемент вектора v1["<<

itr-v1.begin()<<"]= "<<*itr<<endl;

else cout<<"четные элементы в векторе v1 отсутствуют\n";

// std::sort(v1.begin(),v1.end()); // необходимо выполнить

if(std::binary_search(v1.begin(),v1.end(),3)) // сортировку вектора

cout<<"число 3 найдено в векторе v1\n"; // для binary_search

else cout<<"число 3 не найдено в векторе v1\n";

return 0;

}

В приведенной программе использован алгоритм find, выполняющий поиск в векторе v1 значения 5.

itr=std::find(v1.begin(),v1.end(),5);

Далее в программе использована функция find_if нахождения первого значения вектора v, для которого унарная предикатная функция fun возвращает true:

itr=std::find_if(v1.begin(),v1.end(),fun);

Каждый из алгоритмов find и find_if возвращает итератор ввода на найденный элемент либо (если элемент не найден) итератор, равный v.end(). Аргументы find и find_if должны быть, по крайней мере, итераторами ввода.

В строке:

if(std::binary_search(v1.begin(),v1.end(),3))

для поиска значения 3 в векторе v1 использована функция binary_search. При этом последовательность элементов вектора в анализируемом диапазоне должна быть отсортирована в возрастающем порядке. Функция возвращает значение bool. В STD имеется вторая версия алгоритма binary_search, имеющая четвертый параметр, – бинарная предикатная функция, возвращающая true, если два сравниваемых элемента упорядочены.

Алгоритмы fill, fill_n, generate и generate_n

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

Прототип функций fill, fill_n имеет вид:

template<class FwdIt, class T>

void fill(FwdIt first, FwdIt last, const T& x);

template<class OutIt, class Size, class T>

void fill_n(OutIt first, Size n, const T& x);

Пример программы, использующей алгоритм generate, приведен ниже.

#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;

// функция нахождения чисел Фибоначчи

int Fibonacci(void)

{ static int r;

static int f1 = 0;

static int f2 = 1;

r = f1 + f2 ;

f1 = f2 ;

f2 = r ;

return f1 ;

}

void main()

{ const int v_size = 8 ;

typedef vector<int > vect;

typedef vect::iterator vectIt ;

vect numb(v_size); // вектор, содержащий числа

vectIt start, end, it ;

start = numb.begin() ; // позиция первого элемента

end = numb.end() ; // позиция последнего эл-та

// заполнение [first, last +1) числами Фибоначчи

// используя функцию Fibonacci()

generate(start, end, Fibonacci) ;

cout << "numb { " ; // вывод содержимого

for(it = start; it != end; it++)

cout << *it << " " ;

cout << " }\n" << endl ;

}

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