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.

Если вам нужно найти элемент в диапазоне по значению или предикату, наиболее очевидным решением будет использование трех алгоритмов линейного поиска:
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"
