Поиск элементов

Последнее обновление: 31.03.2023

Функция std::find() ищет на определенном диапазоне элементов определенное значение. Для сравнения значений применяется операция сравнения ==. Рассмотрим одну из версий функции:

std::find(start_iterator, end_iterator, value)

Для установки диапазона в функцию передаются итератор на начало и конец диапазона и значение, которое надо найти. Результат функции - итератор на найденное значение. Если же значение не найдено, то возвращаемый итератор указывает на конец диапазона. Например, попробуем найти в векторе чисел некоторые числа

#include <iostream>
#include <vector>
#include <algorithm>
 
void findValue (const std::vector<int>& data, int value)
{
    auto result{ std::find(begin(data), end(data), value) };
    if (result == end(data))
        std::cout << "Value not found" << std::endl;
    else
        std::cout << "Value found at position " << (result - begin(data)) << std::endl;
 }

int main()
{
    std::vector<int> numbers { 1, 2, 3, 4, 5, 6, 7, 8};
    findValue(numbers, 4);    // Value found at position 3 
    findValue(numbers, 12);   // Value not found
}

В данном случае поиск вынесен в отдельную функцию - findValue. В ней ищем в векторе чисел некоторое число. В качестве начала и конца диапазона для поиска в функцию std::find() передаются итераторы на начало и конец вектор:

auto result{ std::find(begin(data), end(data), value) };

Если число не найдено, то полученный итератор равен итератору на конец вектора:

if (result == end(data))

Если же число найдено, то вычитая из полученного итератора итератор на начало вектора, мы можем получить индекс числа в векторе:

std::cout << "Value found at position " << (result - begin(data)) << std::endl;

Поиск по условию

Ряд дополнительных функций возвращают итератор на значение в зависимости от некоторого условия. Функция std::find_if() возвращает итератор на первый элемент диапазона, который удовлетворяет некоторому условию. А функция std::find_if_not(), наоброт, возвращает итератор на первый элемент диапазона, который НЕ удовлетворяет некоторому условиЮ. Посмотрим на примере функции std::find_if():

#include <iostream>
#include <vector>
#include <algorithm>

// если число четное
bool is_even(int n){ return n % 2 == 0;}
// если число положительное
bool is_positive(int n){ return n > 0;}
// если число больше 10
bool is_greater10(int n){ return n > 10;}

template <typename T>
void findValue (const std::vector<T>& data, bool(*condition)(T))
{
    auto result{ std::find_if(begin(data), end(data), condition) };
    if (result == end(data))
        std::cout << "Value not found" << std::endl;
    else
        std::cout << "Value found at position " << (result - begin(data)) << std::endl;
 }

int main()
{
    std::vector<int> numbers { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5};
    findValue(numbers, is_even);        // Value found at position 1
    findValue(numbers, is_positive);    // Value found at position 6
    findValue(numbers, is_greater10);   // Value not found
}

Функция std::find_if() также получает итераторы на начало и конец дипазона для поиска, а третий параметр представляет условие, которому должны удовлетворять значения:

std::find_if(begin(data), end(data), condition)

Условие представляет функцию, которая принимает некоторое значение произвольного типа и возвращает значение типа bool - true, если значение соответствует условию, и false, если не соответствует. Фактически условие можно описать указателем на функцию bool(*condition)(T), где T- произвольный тип.

Для теста здесь определены три функции, которые представляют условия: is_even() (проверяет, является ли число четным), is_positive() (если число положительное) и is_greater10() (если число больше 10).

Функция std::find_if() возвращает итератор на первое найденное значение, которое удовлетворяет условию. Если таких значений не найдено, то итератор указывает на конец диапазона.

Принцип работы std::find_if_not() будет аналогичен.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850