我已经成功使用了:

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

08-27 00:52