Daily bit(e) C++. std::find, std::find_if, std::find_if_not

Добавлено 5 октября 2026 в 12:16

Daily bit(e) C++ 134, поиск элементов в диапазоне по значению или предикату с помощью алгоритмов линейного поиска – std::find, std::find_if, std::find_if_not.

Daily bit(e) C++

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

  • std::find (поиск элемента по значению)
  • std::find_if (поиск элемента по положительному предикату)
  • std::find_if_not (поиск элемента по отрицательному предикату)

Для всех трех алгоритмов существуют версии с поддержкой параллельного выполнения (C++17) и версии, работающие с диапазонами (C++20).

#include <algorithm>
#include <vector>
#include <string>
#include <functional>


std::vector<int> data{1, 2, 3, 4, 5, 6, 7};

// Найти по значению
auto it = std::find(data.begin(), data.end(), 5);
// *it == 5

it = std::find(data.begin(), data.end(), 42);  
// it == data.end()


// Найти с помощью предиката
auto is_even = [](int v) { return v % 2 == 0; };
it = std::find_if(data.begin(), data.end(), is_even);
// *it == 2


// Найти с помощью отрицания предиката
it = std::find_if_not(data.begin(), data.end(), is_even);
// *it == 1

// то же самое
it = std::find_if(data.begin(), data.end(), std::not_fn(is_even));
// *it == 1


// Версия для диапазонов
it = std::ranges::find(data, 3);
// *it == 3

// С проекцией
std::vector<std::string> strs{"a", "bb", "ccc", "dddd"};
// Найти первый элемент, который имеет четную длину
auto it2 = std::ranges::find_if(strs, is_even, 
    [](const std::string& str) {
        return str.length();
    });
// *it2 == "bb"

Пример на Compiler Explorer

Теги

C++ / CppDaily bit(e) C++Программирование