Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost boyer_moore搜索微粒子类型的示例类?_C++_Boost_Case Insensitive_Boyer Moore - Fatal编程技术网

C++ Boost boyer_moore搜索微粒子类型的示例类?

C++ Boost boyer_moore搜索微粒子类型的示例类?,c++,boost,case-insensitive,boyer-moore,C++,Boost,Case Insensitive,Boyer Moore,我成功地使用了: boost::algorithm::boyer_moore_search<const char *,const char *>( haystack, haystack_end, needle, needle_end ) boost::algorithm::boyer\u moore\u搜索(草堆、草堆、针、针端) 大海捞针。现在我想使用BM_搜索对针进行不区分大小写的搜索。由于我的haystack是巨大的,我的计划是将指针转换为小写,并让haystack迭代器将

我成功地使用了:

boost::algorithm::boyer_moore_search<const char *,const char *>( haystack, haystack_end, needle, needle_end )
boost::algorithm::boyer\u moore\u搜索(草堆、草堆、针、针端)
大海捞针。现在我想使用BM_搜索对针进行不区分大小写的搜索。由于我的haystack是巨大的,我的计划是将指针转换为小写,并让haystack迭代器将haystack字符作为一个特殊类处理,其比较函数在比较之前将字母转换为小写。然而,我无法正确地表达这一点。我正在努力:

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 );
类casechar{
公众:
char ch;
//其他的东西…这是不对的,但我认为编译器甚至没有走到这一步
} ;
类caseeter:public std::iterator{
常量casechar*ptr;
公众:
//各种迭代器函数,但显然还不够!
} ;
boost::algorithm::boyer\u moore\u搜索(草堆、草堆、针、针端);
编译器(OSX上的g++)正在抱怨有人试图实例化哈希,我猜是因为一些BM内部的东西。我迷失在模版的迷宫中。我能给某人一点指示吗?我怀疑我只需要在casechar和/或Caseeter中提供某些实现,但我不知道是哪些实现

谢谢

这是:

BOOST_STATIC_ASSERT (( boost::is_same<
                       typename std::iterator_traits<patIter>::value_type, 
                       typename std::iterator_traits<corpusIter>::value_type>::value ));
BOOST\u STATIC\u断言((BOOST::是相同的吗?)<
typename std::迭代器特性::值类型,
typename std::iterator_traits::value_type>::value));
这要求模式的迭代器的值类型与语料库的迭代器的值类型相同。换句话说,您还需要对模式使用
casechar

下面是我要做的:

  • 编写一个带有自定义
    运算符==
    等的
    casechar
    ,以进行不区分大小写的比较
  • 无需编写自定义迭代器
    const casechar*
    是一个完全可以接受的随机访问迭代器
  • 编写一个
    std::hash
    专门化。此专门化可能只返回类似于
    std::hash()(std::tolower(ch))
    的内容

也就是说,与将所有内容转换为小写形式相比,我有点怀疑这是否真的会为您带来性能提升。
char
s的跳过表使用了使用数组而不是
unordered_map
s的优化,以实现更快的索引和更少的堆分配。此优化不用于自定义类型,例如
casechar

请在此处查找示例代码

std::vector<std::wstring> names;
names.push_back(L"Rahul");
names.push_back(L"John");
names.push_back(L"Alexa");
names.push_back(L"Tejas");
names.push_back(L"Alexandra");

std::vector<std::wstring> pattern;
pattern.push_back(L"Tejas");


auto itr = boost::algorithm::boyer_moore_search<std::vector<std::wstring>,
    std::vector<std::wstring>>(names, pattern);

if (itr != names.end())
{
    OutputDebugString(std::wstring(L"pattern found in the names " + *itr).c_str());
}
else
{
    OutputDebugString(std::wstring(L"pattern not found in the names").c_str());
}
std::向量名称;
姓名。推回(L“Rahul”);
姓名。推回(L“John”);
姓名。推回(L“Alexa”);
姓名。推回(L“Tejas”);
姓名。推回(L“Alexandra”);
std::矢量模式;
模式。推回(L“Tejas”);
自动itr=boost::algorithm::boyer\u moore\u搜索(名称、模式);
if(itr!=names.end())
{
OutputDebugString(std::wstring(在名称“+*itr.c_str()”中找到L”模式);
}
其他的
{
OutputDebugString(std::wstring(L“在名称中找不到模式”).c_str();
}
有关我制作的视频代码的工作演示,请访问:


非常感谢!我无法将haystack转换为小写形式——它是只读的,而且非常庞大(我正在将数千GB的文件映射到内存中,并在其中查找字符串)。如果我能找出如何提供跳过表,我想我可以得到BM的速度(你是对的,如果BM使用无序映射,它可能会太慢)。或者,我想我可以自己实现BM——这并不难,如果我没有开始使用模板的话,我可能已经完成了![grumble,grumble]Boost检查模式/语料库类型的大小以及它是否完整。因此,尽管sizeof(casechar)是1(因此优化可以工作),但似乎不可能使boost::is_integral为真。哦,好吧。