std::search
Определено в заголовке <algorithm> | ||
|---|---|---|
| (1) | ||
template< class ForwardIt1, class ForwardIt2 >
ForwardIt1 search( ForwardIt1 first, ForwardIt1 last,
ForwardIt2 s_first, ForwardIt2 s_last ); | (до C++20) | |
template< class ForwardIt1, class ForwardIt2 >
constexpr ForwardIt1 search( ForwardIt1 first, ForwardIt1 last,
ForwardIt2 s_first, ForwardIt2 s_last );
| (с C++20) | |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
ForwardIt1 search( ExecutionPolicy&& policy,
ForwardIt1 first, ForwardIt1 last,
ForwardIt2 s_first, ForwardIt2 s_last );
| (2) | (с C++17) |
| (3) | ||
template< class ForwardIt1, class ForwardIt2, class BinaryPredicate >
ForwardIt1 search( ForwardIt1 first, ForwardIt1 last,
ForwardIt2 s_first, ForwardIt2 s_last,
BinaryPredicate p ); | (до C++20) | |
template< class ForwardIt1, class ForwardIt2, class BinaryPredicate >
constexpr ForwardIt1 search( ForwardIt1 first, ForwardIt1 last,
ForwardIt2 s_first, ForwardIt2 s_last,
BinaryPredicate p );
| (с C++20) | |
template< class ExecutionPolicy,
class ForwardIt1, class ForwardIt2, class BinaryPredicate >
ForwardIt1 search( ExecutionPolicy&& policy,
ForwardIt1 first, ForwardIt1 last,
ForwardIt2 s_first, ForwardIt2 s_last,
BinaryPredicate p );
| (4) | (с C++17) |
| (5) | ||
template< class ForwardIt, class Searcher >
ForwardIt search( ForwardIt first, ForwardIt last,
const Searcher& searcher ); |
(с C++17) (до C++20) | |
template< class ForwardIt, class Searcher >
constexpr ForwardIt search( ForwardIt first, ForwardIt last,
const Searcher& searcher );
| (с C++20) |
[s_first, s_last) в диапазоне [first, last).operator==.p.policy. Эти перегрузки не участвуют в разрешении перегрузки, если |
| (до C++20) |
|
| (с C++20) |
[first, last) шаблон, указанный в конструкторе searcher. Searcher не обязательно должна быть CopyConstructible.| Стандартная библиотека предоставляет следующие алгоритмы поиска:
| (с C++17) |
Параметры
| first, last | - | диапазон элементов для проверки |
| s_first, s_last | - | диапазон элементов для поиска |
| policy | - | используемая политика выполнения. Подробности см. в политике выполнения. |
| searcher | - | объект поиска, содержащий алгоритм поиска и шаблон для поиска |
| p | - | бинарный предикат, возвращающий true если элементы должны рассматриваться как равные. Подпись функции предиката должна быть эквивалентной следующей:
Хотя подпись не обязательно должна содержать |
| Требования к типу | ||
-ForwardIt1, ForwardIt2 должен удовлетворять требованиям LegacyForwardIterator. |
||
Возвращаемое значение
[s_first, s_last) в диапазоне [first, last). Если такое вхождение не найдено, возвращается last.[s_first, s_last) пусто, возвращается first.searcher(first, last).first.Сложность
std::distance(first, last) и \(\scriptsize S\)S как std::distance(s_first, s_last):operator==.p.searcher.Исключения
Перегрузки с параметром шаблона, названным ExecutionPolicy сообщают об ошибках следующим образом:
- Если выполнение функции, вызванной в рамках алгоритма, вызывает исключение, и
ExecutionPolicyявляется одной из стандартных политик, вызываетсяstd::terminate. Для любой другойExecutionPolicy, поведение зависит от реализации. - Если алгоритм не может выделить память, выбрасывается
std::bad_alloc.
Возможная реализация
| search (1) |
|---|
template<class ForwardIt1, class ForwardIt2>
constexpr ForwardIt1 search(ForwardIt1 first, ForwardIt1 last,
ForwardIt2 s_first, ForwardIt2 s_last)
{
while (true)
{
ForwardIt1 it = first;
for (ForwardIt2 s_it = s_first; ; ++it, ++s_it)
{
if (s_it == s_last)
return first;
if (it == last)
return last;
if (!(*it == *s_it))
break;
}
++first;
}
} |
| search (3) |
template<class ForwardIt1, class ForwardIt2, class BinaryPredicate>
constexpr ForwardIt1 search(ForwardIt1 first, ForwardIt1 last,
ForwardIt2 s_first, ForwardIt2 s_last,
BinaryPredicate p)
{
while (true)
{
ForwardIt1 it = first;
for (ForwardIt2 s_it = s_first; ; ++it, ++s_it)
{
if (s_it == s_last)
return first;
if (it == last)
return last;
if (!p(*it, *s_it))
break;
}
++first;
}
} |
Пример
#include <algorithm>
#include <cassert>
#include <functional>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <string_view>
#include <vector>
using namespace std::literals;
bool contains(const auto& cont, std::string_view s)
{
// str.find() (or str.contains(), since C++23) can be used as well
return std::search(cont.begin(), cont.end(), s.begin(), s.end()) != cont.end();
}
int main()
{
const auto str{"why waste time learning, when ignorance is instantaneous?"sv};
assert(contains(str, "learning"));
assert(not contains(str, "lemming"));
const std::vector vec(str.begin(), str.end());
assert(contains(vec, "learning"));
assert(not contains(vec, "leaning"));
// The C++17 overload with searchers demo:
constexpr auto quote
{
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed "
"do eiusmod tempor incididunt ut labore et dolore magna aliqua"sv
};
for (const auto word : {"pisci"sv, "Pisci"sv})
{
std::cout << "The string " << std::quoted(word) << ' ';
const std::boyer_moore_searcher searcher(word.begin(), word.end());
const auto it = std::search(quote.begin(), quote.end(), searcher);
if (it == quote.end())
std::cout << "not found\n";
else
std::cout << "found at offset " << std::distance(quote.begin(), it) << '\n';
}
}Вывод:
The string "pisci" found at offset 43 The string "Pisci" not found
Отчеты об ошибках
Следующие отчеты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение как опубликовано | Правильное поведение |
|---|---|---|---|
| LWG 1205 | C++98 | значение возврата было неясно, если [s_first, s_last) пусто | в этом случае возвращается first |
| LWG 1338 | C++98 | решение LWG issue 1205 было неправильно применено, заставляя возвращаться first если ни одно вхождение не найдено | в этом случае возвращается last |
См. также
| находит последнюю последовательность элементов в определённом диапазоне (функция-шаблон) |
|
возвращает true если одна последовательность является подпоследовательностью другой (функция-шаблон) |
|
| определяет, являются ли два набора элементов одинаковыми (функция-шаблон) |
|
|
(C++11) | находит первый элемент, удовлетворяющий определённым критериям (функция-шаблон) |
возвращает true если один диапазон лексикографически меньше другого (функция-шаблон) |
|
| находит первую позицию, где два диапазона отличаются (функция-шаблон) |
|
| ищет в диапазоне заданное количество последовательных копий элемента (функция-шаблон) |
|
|
(C++17) | реализация стандартного алгоритма поиска C++ (шаблон класса) |
|
(C++17) | Реализация алгоритма поиска Бойера-Мура (шаблон класса) |
|
(C++17) | Реализация алгоритма поиска Бойера-Мура-Хорспула (шаблон класса) |
|
(C++20) | поиск диапазона элементов (niebloid) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/algorithm/search