【问题标题】:Wildcard search inside a Boost.MultiIndex data structure?Boost.MultiIndex 数据结构中的通配符搜索?
【发布时间】:2009-10-06 15:58:40
【问题描述】:

我正在尝试通过减少对数据库的往返次数来优化我的应用程序。作为这项工作的一部分,我一直在将一些表移动到内存中,并将它们存储为 Boost.MultiIndex 容器。

作为此过程的副作用,我失去了对字符串进行通配符匹配的能力。例如,当表存储在 MySQL 中时,我可以这样做:

SELECT * FROM m_table WHERE myString LIKE "foo%"

但是,由于我现在使用带有 myString 键的 Boost.MultiIndex 容器,因此我似乎失去了这种能力。

显然,我可以使用 equal_range() 函数来查找与特定字符串完全匹配的所有条目:

std::pair< typename T::template index<by_name>::type::iterator,
           typename T::template index<by_name>::type::iterator > p
  = m_table.get<by_name>().equal_range(myString);

while (p.first != p.second )
{
  // do something with the EXACT matching entry
  ++p.first;
}

但似乎进行通配符匹配的唯一方法是遍历整个结构并将每个键与 boost::regex 与 boost::regex_match() 进行比较。

std::pair< typename T::template index<by_name>::type::iterator,
           typename T::template index<by_name>::type::iterator > p
  = std::make_pair(m_table.get<by_name>().begin(),m_table.get<by_name>().end());

while (p.first != p.second )
{
  boost::regex e(myRegex);
  if ( boost::regex_match(p.first->myString, e ) )
  {
     // Do something with the REGEX matching entry
  }
  ++p.first;
}

有没有更好的办法?

【问题讨论】:

  • 我对 MySQL 不熟悉,但是您是否认为当您使用通配符进行这样的过度特定搜索时,会与使用正则表达式的线性搜索有所不同? (我对此表示怀疑)。您也可以制作自己的函数来包装此行为,例如auto search_by_name(boost::regex e, multi_index_type m_table){ ...; return match;}

标签: c++ mysql boost wildcard boost-multi-index


【解决方案1】:

好吧,首先你实际上不必使用 boost::regex,如果通配符足够简单,你可以通过滚动你自己的一元运算符来摆脱。我会注意到 Boost.Regex 是库中实际需要链接的少数部分之一(不是仅标题)。

至于走完整个结构的问题,很抱歉,这里没有什么可以帮你的……如果你不知道提前搜索的话。

如果您事先知道要查找的参数,则可以使用专用比较器/哈希器创建适合执行此任务的多索引容器的特殊视图(例如,仅包含记前 3 个字符)。

如果您希望获得更多信息,请提供有关您要使用的通配符类型和情况的更多信息。

【讨论】:

    【解决方案2】:

    在您的特定情况下,您可以执行 lower_bound("foo") 然后向前走寻找匹配项,直到遇到不匹配的内容或到达容器的末尾。不过,我认为没有一种通用的方法可以进行此查找。

    【讨论】:

    • equal_range其实相当于一次性使用lower_bound和upper_bound。
    • 但您不是在寻找精确的“foo”匹配项,而是在寻找以“foo”开头的字符串,它超过了上界。
    猜你喜欢
    • 1970-01-01
    • 2012-07-25
    • 2018-01-17
    • 2011-12-10
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多