◐ Shell
clean mode source ↗

std::search — cppreference.com

Материал из cppreference.com

<tbody> </tbody>

Определено в заголовочном файле <algorithm>

template< class ForwardIt1, class ForwardIt2 > ForwardIt1 search( ForwardIt1 first, ForwardIt1 last, ForwardIt2 s_first, ForwardIt2 s_last );

(1)

template< class ForwardIt1, class ForwardIt2, class BinaryPredicate > ForwardIt1 search( ForwardIt1 first, ForwardIt1 last, ForwardIt2 s_first, ForwardIt2 s_last, BinaryPredicate p );

(2)

Ищет первое вхождение последовательности элементов [s_firsts_last) в диапазон [firstlast - (s_last - s_first)). Первый вариант использует operator== для сравнения элементов, второй вариант использует заданный бинарный предикат p.

Параметры

[firstlast) два итератора задающих диапазон элементов для проверки
[s_firsts_last) два итератора задающих диапазон элементов для сравнения
p бинарный предикат, который возвращает ​true если элементы следует считать равными.

Определение функции предиката должно быть эквивалентно следующему:

bool pred(const Type1 &a, const Type2 &b);

Определение не должно обязательно содержать const &, но функция не должна модифицировать принимаемые объекты.
Типы Type1 и Type2 должны быть таковы, что объекты типов ForwardIt1 и ForwardIt2 могут быть разыменованы и затем неявно преобразованы в Type1 и Type2 соответственно.

Требования к типам
-ForwardIt1 должен соответствовать требованиям ForwardIterator.
-ForwardIt2 должен соответствовать требованиям ForwardIterator.

Возвращаемое значение

Итератор на начало первой подпоследовательности [s_firsts_last) в диапазоне [firstlast - (s_last - s_first)). Если такая последовательность не найдена, возвращается last.

Если [s_firsts_last) пуста, возвращается first. (начиная с C++11)

Сложность

Не больше S*N сравнений, где S= std::distance(s_first, s_last), N = std::distance(first, last).

Возможная реализация

Первый вариант
template<class ForwardIt1, class ForwardIt2>
ForwardIt1 search(ForwardIt1 first, ForwardIt1 last,
                        ForwardIt2 s_first, ForwardIt2 s_last)
{
    for (; ; ++first) {
        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;
            }
        }
    }
}
Второй вариант
template<class ForwardIt1, class ForwardIt2, class BinaryPredicate>
ForwardIt1 search(ForwardIt1 first, ForwardIt1 last,
                        ForwardIt2 s_first, ForwardIt2 s_last,
                        BinaryPredicate p)
{
    for (; ; ++first) {
        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;
            }
        }
    }
}

Пример

#include <string>
#include <algorithm>
#include <iostream>

template<typename Container>
bool in_quote(const Container& cont, const std::string& s)
{
    return std::search(cont.begin(), cont.end(), s.begin(), s.end()) != cont.end();
}

int main()
{
    std::string str = "Зачем тратить время на обучение, если невежество приходит мгновенно?";
    // также может использоваться str.find()
    std::cout << std::boolalpha << in_quote(str, "обучение") << '\n'
                                << in_quote(str, "обручение")  << '\n';

    std::vector<char> vec(str.begin(), str.end());
    std::cout << std::boolalpha << in_quote(vec, "обучение") << '\n'
                                << in_quote(vec, "обручение")  << '\n';
}

Вывод:

См. также

находит последнюю последовательность элементов в определённом диапазоне
(шаблон функции) [править]
определяет, одинаковы ли два множества элементов
(шаблон функции) [править]
находит первый элемент, соответствущий определённым критериям
(шаблон функции) [править]
возвращает true, если один диапазон лексикографически меньше другого
(шаблон функции) [править]
находит первую позицию, в которой два диапазона различаются
(шаблон функции) [править]
ищет несколько последовательных копий элемента в диапазоне
(шаблон функции) [править]