Пространства имён
Варианты
Действия

std::search_n

Материал из cppreference.com
< cpp‎ | algorithm
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы над диапазонами (C++20)
Ограниченные алгоритмы, например ranges::copy, ranges::sort, ...
Политики исполнения (C++17)
Немодифицирующие операции над последовательностями
(C++11)(C++11)(C++11)
(C++17)
Модифицирующие операции над последовательностями
Операции разбиения
Операции сортировки
(C++11)
Операции двоичного поиска
Операции с наборами (в отсортированных диапазонах)
Операции с кучей
(C++11)
Операций минимума/максимума
(C++11)
(C++17)

Операции перестановки
Числовые операции
Операции с неинициализированной памятью
(C++17)
(C++17)
(C++17)
Библиотека C
 
Определено в заголовочном файле <algorithm>
template< class ForwardIt, class Size, class T >
ForwardIt1 search_n( ForwardIt first, ForwardIt last, Size count, const T& value );
(1)
template< class ForwardIt, class Size, class T, class BinaryPredicate >

ForwardIt1 search_n( ForwardIt first, ForwardIt last, Size count, const T& value,

                     BinaryPredicate p );
(2)

Ищет в диапазоне [firstlast) первую последовательность count одинаковых элементов, каждый из которых равен заданному значению value. Первый вариант использует operator== для сравнения элементов, второй вариант использует заданный бинарный предикат p.

Содержание

[править] Параметры

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

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

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

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

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

[править] Возвращаемое значение

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

[править] Сложность

Не больше last - first применений предиката.

[править] Возможная реализация

Первый вариант
template<class ForwardIt, class Size, class T>
ForwardIt search_n(ForwardIt first, ForwardIt last,
                          Size count, const T& value)
{
    Size curr_count = 0;
    ForwardIt result, t_last = first;
    std::advance(t_last, std::distance(first, last) - count + 1);
 
    for (; first != t_last; first++) {
        curr_count = 0;
        result = first;
        while (*first == value) {
            curr_count++;
            if (curr_count == count) {
                return result;
            }
            ++first;
        }
    }
    return last;
}
Второй вариант
template<class ForwardIt, class Size, class T, class BinaryPredicate>
ForwardIt search_n(ForwardIt first, ForwardIt last,
                          Size count, const T& value, BinaryPredicate p)
{
    Size curr_count = 0;
    ForwardIt result, t_last = first;
    std::advance(t_last, std::distance(first, last) - count + 1);
 
    for (; first != t_last; first++) {
        curr_count = 0;
        result = first;
        while (p(*first,value)) {
            curr_count++;
            if (curr_count == count) {
                return result;
            }
            ++first;
        }
    }
    return last;
}

[править] Пример

#include <iostream>     
#include <algorithm>    
#include <vector>    
 
using namespace std;
 
bool pred (int i, int j) {
  return (i==j);
}
 
int main () 
{ 
   vector<int> myvector {10,20,30,30,30,20,10,10,20};
 
  //Поиск {30,30,30}
  auto it = search_n (begin(myvector), end(myvector), 3, 30);
 
  if (it!=end(myvector))
    cout << "Последовательность {30,30,30} позиция: " << distance(begin(myvector), it) << '\n';
  else
    cout << "Ничего не найдено\n";
 
  //Поиск {10,10}
  it = search_n (begin(myvector), end(myvector), 2, 10, pred);
 
  if (it!=end(myvector))
    cout << "Последовательность {10,10} позиция: " << distance(begin(myvector), it) << '\n';
  else
    cout << "Ничего не найдено\n";
 
  return 0;
}

Вывод:

Последовательность {30,30,30} позиция: 2
Последовательность {10,10} позиция: 6

[править] См. также

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