我已经成功使用了:
boost::algorithm::boyer_moore_search<const char *,const char *>( haystack, haystack_end, needle, needle_end )
在大海捞针中寻找针头。现在,我想使用BM_search对针进行不区分大小写的搜索。由于我的干草堆很大,因此我的计划是将针转换为小写,并使干草堆迭代器将干草堆字符视为特殊类,其比较功能在比较之前将字母转换为小写。但是,我无法正确表达这一点。我尝试着:
class casechar {
public:
char ch;
// other stuff...it's not right, but I don't think the compiler is even getting this far
} ;
class caseiter : public std::iterator<random_access_iterator_tag,casechar> {
const casechar *ptr;
public:
// various iterator functions, but not enough of them, apparently!
} ;
boost::algorithm::boyer_moore_search<const caseiter,const char *>( HaYsTaCk, HaYsTaCk_EnD, needle, needle_end );
编译器(在OSX上为g ++)抱怨实例化hash 的尝试,我想这是一些BM内部问题。我迷失在模板的迷宫中。我可以向某人强加一些指导吗?我怀疑我只需要在casechar和/或caseiter中提供某些实现,但是我不知道哪个实现。
谢谢!
最佳答案
The first problem you will run into是这样的:
BOOST_STATIC_ASSERT (( boost::is_same<
typename std::iterator_traits<patIter>::value_type,
typename std::iterator_traits<corpusIter>::value_type>::value ));
这要求模式的迭代器和语料库的迭代器的值类型为同一类型。换句话说,您还需要对模式使用
casechar
。这是我要做的:
用自定义
casechar
等编写一个operator ==
,用于不区分大小写的比较。无需编写自定义迭代器。
const casechar *
是完全可以接受的随机访问迭代器。编写
std::hash<casechar>
专长。这种专业化可能应该简单地返回类似std::hash<char>()(std::tolower(ch))
的内容。就是说,与仅将所有内容转换为小写字母相比,我有点怀疑这是否会真正为您带来性能提升。
char
的跳过表使用的优化使用数组而不是unordered_map
来加快索引编制速度和减少堆分配。此优化不适用于自定义类型,例如casechar
。