std::boyer_moore_horspool_searcher

来自cppreference.com
< cpp‎ | utility‎ | functional
 
 
工具库
语言支持
类型支持(基本类型、RTTI)
库功能特性测试宏 (C++20)
动态内存管理
程序工具
协程支持 (C++20)
变参数函数
调试支持
(C++26)
三路比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
初等字符串转换
(C++17)
(C++17)

 
函数对象
函数调用
(C++17)(C++23)
恒等函数对象
(C++20)
通透运算符包装器
(C++14)
(C++14)
(C++14)
(C++14)  
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)

取反器
(C++17)
搜索器
boyer_moore_horspool_searcher
(C++17)
旧式绑定器与适配器
(C++17 前*)
(C++17 前*)
(C++17 前*)
(C++17 前*)
(C++17 前*)(C++17 前*)(C++17 前*)(C++17 前*)
(C++20 前*)
(C++20 前*)
(C++17 前*)(C++17 前*)
(C++17 前*)(C++17 前*)

(C++17 前*)
(C++17 前*)(C++17 前*)(C++17 前*)(C++17 前*)
(C++20 前*)
(C++20 前*)
 
在标头 <functional> 定义
template< class RandomIt1,

          class Hash = std::hash<typename std::iterator_traits<RandomIt1>::value_type>,
          class BinaryPredicate = std::equal_to<> >

class boyer_moore_horspool_searcher;
(C++17 起)

适用于 std::search搜索器 (Searcher) 重载的搜索器,实现 Boyer-Moore-Horspool 字符串搜索算法

std::boyer_moore_horspool_searcher 可复制构造 (CopyConstructible) 可复制赋值 (CopyAssignable)

RandomIt1 必须满足老式随机访问迭代器 (LegacyRandomAccessIterator) 的要求。

成员函数

std::boyer_moore_horspool_searcher::boyer_moore_horspool_searcher

boyer_moore_horspool_searcher( RandomIt1 pat_first,

                               RandomIt1 pat_last,
                               Hash hf = Hash(),

                               BinaryPredicate pred = BinaryPredicate() );

通过存储 pat_firstpat_lasthfpred 的副本构造一个 std::boyer_moore_horspool_searcher,建立任何必要的内部数据结构。

RandomIt1 的值类型必须可默认构造 (DefaultConstructible) 可复制构造 (CopyConstructible) 可复制赋值 (CopyAssignable)

对于任意两个 std::iterator_traits<RandomIt1>::value_type 类型的值 AB,若 pred(A, B) == true,则 hf(A) == hf(B) 应为 true

参数

pat_first, pat_last - 表示要搜索的字符串的一对迭代器
hf - 用于散列字符串元素的可调用对象
pred - 用于确定相等性的可调用对象

异常

下列操作抛出的任何异常:

  • RandomIt1 的复制构造函数;
  • RandomIt1 的值类型的默认构造函数、复制构造函数或复制赋值运算符;或
  • BinaryPredicateHash 的复制构造函数或函数调用运算符。

若无法分配内部数据结构所需的附加内存,则亦可能抛出 std::bad_alloc

std::boyer_moore_horspool_searcher::operator()

template< class RandomIt2 >
std::pair<RandomIt2, RandomIt2> operator()( RandomIt2 first, RandomIt2 last ) const;

std::search 的搜索器(Searcher)重载调用该成员函数,以用此搜索器进行搜索。RandomIt2 必须满足老式随机访问迭代器 (LegacyRandomAccessIterator) 的要求。

RandomIt1RandomIt2 必须拥有相同的值类型。

参数

first, last - 指代要检验的字符串的一对迭代器

返回值

若模式 [pat_firstpat_last) 为空,则返回 std::make_pair(first, first)

否则,返回一对迭代器,指向 [firstlast) 中所定位的与 [pat_firstpat_last)pred 的定义比较相等的子序列的首及尾后一位,否则返回 std::make_pair(last, last)

注解

功能特性测试 标准 功能特性
__cpp_lib_boyer_moore_searcher 201603L (C++17) 搜索器

示例

#include <algorithm>
#include <functional>
#include <iomanip>
#include <iostream>
#include <string_view>
 
int main()
{
    constexpr std::string_view in =
        "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed "
        "do eiusmod tempor incididunt ut labore et dolore magna aliqua";
 
    const std::string_view needle{"pisci"};
 
    auto it = std::search(in.begin(), in.end(),
                  std::boyer_moore_horspool_searcher(
                      needle.begin(), needle.end()));
    if (it != in.end())
        std::cout << "字符串 " << std::quoted(needle) << " 在偏移 "
                  << it - in.begin() << " 处找到\n";
    else
        std::cout << "字符串 " << std::quoted(needle) << " 未找到\n";
}

输出:

字符串 "pisci" 在偏移 43 处找到

参阅

搜索一个元素范围的首次出现
(函数模板)
标准 C++ 库搜索算法实现
(类模板)
Boyer-Moore 搜索算法实现
(类模板)