std::boyer_moore_searcher
在标头 <functional> 定义
|
||
template< class RandomIt1, class Hash = std::hash<typename std::iterator_traits<RandomIt1>::value_type>, |
(C++17 起) | |
适用于 std::search 的搜索器 (Searcher) 重载的搜索器,实现 Boyer-Moore 字符串搜索算法。
std::boyer_moore_searcher
可复制构造 (CopyConstructible) 且可复制赋值 (CopyAssignable) 。
RandomIt1
必须满足老式随机访问迭代器 (LegacyRandomAccessIterator) 的要求。
成员函数
std::boyer_moore_searcher::boyer_moore_searcher
boyer_moore_searcher( RandomIt1 pat_first, RandomIt1 pat_last, |
||
通过存储 pat_first、pat_last、hf 和 pred 的副本构造一个 std::boyer_moore_searcher
,建立任何必要的内部数据结构。
RandomIt1
的值类型必须可默认构造 (DefaultConstructible) 、可复制构造 (CopyConstructible) 且可复制赋值 (CopyAssignable) 。
对于任意两个 std::iterator_traits<RandomIt1>::value_type 类型的值 A
和 B
,若 pred(A, B) == true,则 hf(A) == hf(B) 应为 true。
参数
pat_first, pat_last | - | 表示要搜索的字符串的一对迭代器 |
hf | - | 用于散列字符串元素的可调用对象 |
pred | - | 用于确定相等性的可调用对象 |
异常
下列操作抛出的任何异常:
-
RandomIt1
的复制构造函数; -
RandomIt1
的值类型的默认构造函数、复制构造函数和复制赋值运算符;或 -
BinaryPredicate
或Hash
的复制构造函数和函数调用运算符。
若无法分配内部数据结构所需的附加内存,则亦可能抛出 std::bad_alloc。
std::boyer_moore_searcher::operator()
template< class RandomIt2 > std::pair<RandomIt2, RandomIt2> operator()( RandomIt2 first, RandomIt2 last ) const; |
(C++17 起) | |
std::search 的搜索器(Searcher)重载调用该成员函数,以用此搜索器进行搜索。RandomIt2
必须满足老式随机访问迭代器 (LegacyRandomAccessIterator) 的要求。
RandomIt1
与 RandomIt2
必须拥有相同的值类型。
参数
first, last | - | 指代要检验的字符串的一对迭代器 |
返回值
若模式 [
pat_first,
pat_last)
为空,则返回 std::make_pair(first, first)。
否则,返回一对迭代器,指向 [
first,
last)
中所定位的与 [
pat_first,
pat_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 haystack = "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"}; if (const auto it = std::search(haystack.begin(), haystack.end(), std::boyer_moore_searcher(needle.begin(), needle.end())); it != haystack.end() ) std::cout << "字符串 " << std::quoted(needle) << " 在偏移 " << it - in.begin() << " 处找到\n"; else std::cout << "字符串 " << std::quoted(needle) << " 未找到\n"; }
输出:
字符串 "pisci" 在偏移 43 处找到
参阅
搜索一个元素范围的首次出现 (函数模板) | |
(C++17) |
标准 C++ 库搜索算法实现 (类模板) |
Boyer-Moore-Horspool 搜索算法实现 (类模板) |