Boost.MultiIndex数据结构中的通配符搜索?

时间:2009-10-06 15:58:41

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

我正在尝试通过减少到我的数据库的往返来优化我的应用程序。作为这项工作的一部分,我一直在将一些表移动到内存中,将它们存储为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_match()将每个键与boost :: regex进行比较。

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;
}

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

至于走整个结构的问题,我很抱歉,但是如果你不知道预付款中的搜索,那么你可以在这里做多少...

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

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