23 General utilities library [utilities]

23.14 Function objects [function.objects]

23.14.14 Searchers [func.search]

В этом подпункте предусмотрены function object types операции, которые ищут последовательность[pat_first, pat_­last) в другой последовательности,[first, last) которая предоставляется оператору вызова функции объекта. Первая последовательность (шаблон для поиска) предоставляется конструктору объекта, а вторая (последовательность для поиска) предоставляется оператору вызова функции.

Каждая специализация шаблона класса , указанного в настоящем подпункте ,[func.search] должны отвечатьCopyConstructible иCopyAssignable требованиям. Параметры шаблона с именем

  • ForwardIterator,

  • ForwardIterator1,

  • ForwardIterator2,

  • RandomAccessIterator,

  • RandomAccessIterator1,

  • RandomAccessIterator2, а также

  • BinaryPredicate

шаблонов, указанных в этом подпункте, [func.search] должны соответствовать тем же требованиям и семантике, что и в[algorithms.general]. Названные параметры шаблонаHash должны соответствовать требованиям, указанным в[hash.requirements].

Программа поиска Бойера-Мура реализует алгоритм поиска Бойера-Мура. Программа поиска Boyer-Moore-Horspool реализует алгоритм поиска Boyer-Moore-Horspool. В общем, поисковик Бойера-Мура будет использовать больше памяти и работать лучше, чем Бойер-Мур-Хорспул.

23.14.14.1 Class template default_­searcher [func.search.default]

template <class ForwardIterator1, class BinaryPredicate = equal_to<>>
  class default_searcher {
  public:
    default_searcher(ForwardIterator1 pat_first, ForwardIterator1 pat_last,
                     BinaryPredicate pred = BinaryPredicate());

    template <class ForwardIterator2>
      pair<ForwardIterator2, ForwardIterator2>
        operator()(ForwardIterator2 first, ForwardIterator2 last) const;

  private:
    ForwardIterator1 pat_first_;        // exposition only
    ForwardIterator1 pat_last_;         // exposition only
    BinaryPredicate pred_;              // exposition only
  };

default_searcher(ForwardIterator pat_first, ForwardIterator pat_last, BinaryPredicate pred = BinaryPredicate());

Effects: Создаетdefault_­searcher объект, инициализируясьpat_­first_­ с помощьюpat_­first, pat_­last_­с помощьюpat_­lastи pred_­ с помощьюpred.

Throws: Любое исключение, созданное конструктором копированияBinaryPredicate или ForwardIterator1.

template<class ForwardIterator2> pair<ForwardIterator2, ForwardIterator2> operator()(ForwardIterator2 first, ForwardIterator2 last) const;

Effects: Возвращает пару итераторовi иj таких, что

  • i == search(first, last, pat_­first_­, pat_­last_­, pred_­), а также

  • еслиi == last, тоj == lastиначеj == next(i, distance(pat_­first_­, pat_­last_­)).

23.14.14.2 Class template boyer_­moore_­searcher [func.search.bm]

template <class RandomAccessIterator1,
          class Hash = hash<typename iterator_traits<RandomAccessIterator1>::value_type>,
          class BinaryPredicate = equal_to<>>
  class boyer_moore_searcher {
  public:
    boyer_moore_searcher(RandomAccessIterator1 pat_first,
                         RandomAccessIterator1 pat_last,
                         Hash hf = Hash(),
                         BinaryPredicate pred = BinaryPredicate());

    template <class RandomAccessIterator2>
      pair<RandomAccessIterator2, RandomAccessIterator2>
        operator()(RandomAccessIterator2 first, RandomAccessIterator2 last) const;

  private:
    RandomAccessIterator1 pat_first_;   // exposition only
    RandomAccessIterator1 pat_last_;    // exposition only
    Hash hash_;                         // exposition only
    BinaryPredicate pred_;              // exposition only
  };

boyer_moore_searcher(RandomAccessIterator1 pat_first, RandomAccessIterator1 pat_last, Hash hf = Hash(), BinaryPredicate pred = BinaryPredicate());

Requires: Тип значенияRandomAccessIterator1 должен соответствоватьDefaultConstructible требованиям,CopyConstructible требованиям иCopyAssignable требованиям.

Requires: Для любых двух значенийA иB типаiterator_­traits<RandomAccessIterator1>​::​value_­type, еслиpred(A, B) == true, тоhf(A) == hf(B) должно бытьtrue.

Effects: Создаетboyer_­moore_­searcher объект, инициализируясьpat_­first_­ сpat_­first, pat_­last_­ сpat_­last,hash_­ сhfиpred_­ сpred.

Throws: Любое исключение брошенная копию конструктораRandomAccessIterator1, или с помощью конструктора по умолчанию, конструктор копирования или оператор присваивания копии типа ценностнойRandomAccessIterator1или конструктор копирования илиoperator() изBinaryPredicate илиHash. Можетbad_­alloc вызвать ошибку, если не может быть выделена дополнительная память, необходимая для внутренних структур данных.

template <class RandomAccessIterator2> pair<RandomAccessIterator2, RandomAccessIterator2> operator()(RandomAccessIterator2 first, RandomAccessIterator2 last) const;

Requires: RandomAccessIterator1 иRandomAccessIterator2 должен иметь один и тот же тип значения.

Effects: Находит подпоследовательность равных значений в последовательности.

Returns: Пара итераторовi иj такие, что

  • i - это первый итератор в диапазоне,[first, last - (pat_­last_­ - pat_­first_­)) такой, что для каждого неотрицательного целого числа,n меньшего, чемpat_­last_­ - pat_­first_­ выполняется следующее условие:, pred(*(i + n), *(pat_­first_­ + n)) != falseи

  • j == next(i, distance(pat_­first_­, pat_­last_­)).

Возвращает,make_­pair(first, first) если[pat_­first_­, pat_­last_­) пусто, в противном случае возвращает,make_­pair(last, last) если такой итератор не найден.

Complexity: В большинстве(last - first) * (pat_­last_­ - pat_­first_­) случаев применения предиката.

23.14.14.3 Class template boyer_­moore_­horspool_­searcher [func.search.bmh]

template <class RandomAccessIterator1,
          class Hash = hash<typename iterator_traits<RandomAccessIterator1>::value_type>,
          class BinaryPredicate = equal_to<>>
  class boyer_moore_horspool_searcher {
  public:
    boyer_moore_horspool_searcher(RandomAccessIterator1 pat_first,
                                  RandomAccessIterator1 pat_last,
                                  Hash hf = Hash(),
                                  BinaryPredicate pred = BinaryPredicate());

    template <class RandomAccessIterator2>
      pair<RandomAccessIterator2, RandomAccessIterator2>
        operator()(RandomAccessIterator2 first, RandomAccessIterator2 last) const;

  private:
    RandomAccessIterator1 pat_first_;   // exposition only
    RandomAccessIterator1 pat_last_;    // exposition only
    Hash hash_;                         // exposition only
    BinaryPredicate pred_;              // exposition only
  };

boyer_moore_horspool_searcher(RandomAccessIterator1 pat_first, RandomAccessIterator1 pat_last, Hash hf = Hash(), BinaryPredicate pred = BinaryPredicate());

Requires: Тип значенияRandomAccessIterator1 должны удовлетворятьDefaultConstructible, CopyConstructibleиCopyAssignable требования.

Requires: Для любых двух значенийA иB типаiterator_­traits<RandomAccessIterator1>​::​value_­type, еслиpred(A, B) == true, тоhf(A) == hf(B) должно бытьtrue.

Effects: Создаетboyer_­moore_­horspool_­searcher объект, инициализируясьpat_­first_­ сpat_­first, pat_­last_­ сpat_­last,hash_­ сhfиpred_­ сpred.

Throws: Любое исключение брошенная копию конструктораRandomAccessIterator1, или с помощью конструктора по умолчанию, конструктор копирования или оператор присваивания копии типа ценностнойRandomAccessIterator1 или копирующего конструктора илиoperator() изBinaryPredicate илиHash. Можетbad_­alloc вызвать ошибку, если не может быть выделена дополнительная память, необходимая для внутренних структур данных.

template <class RandomAccessIterator2> pair<RandomAccessIterator2, RandomAccessIterator2> operator()(RandomAccessIterator2 first, RandomAccessIterator2 last) const;

Requires: RandomAccessIterator1 иRandomAccessIterator2 должен иметь один и тот же тип значения.

Effects: Находит подпоследовательность равных значений в последовательности.

Returns: Пара итераторовi иj такие, что

  • i - это первый итераторi в диапазоне, [first, last - (pat_­last_­ - pat_­first_­)) такой, что для каждого неотрицательного целого числа,n меньшего, чемpat_­last_­ - pat_­first_­ выполняется следующее условие:, pred(*(i + n), *(pat_­first_­ + n)) != falseи

  • j == next(i, distance(pat_­first_­, pat_­last_­)).

Возвращает,make_­pair(first, first) если[pat_­first_­, pat_­last_­) пусто, в противном случае возвращает,make_­pair(last, last) если такой итератор не найден.

Complexity: В большинстве(last - first) * (pat_­last_­ - pat_­first_­) случаев применения предиката.