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

作为此过程的副作用,我失去了在弦上进行通用匹配的能力。例如,当桌子存储在mysql中时,我可以这样做:

SELECT * FROM m_table WHERE myString LIKE "foo%"

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

显然,我可以使用quare_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;
}

有没有更好的办法?

有帮助吗?

解决方案

好吧,首先,您实际上不必使用boost :: Regex,如果通配符很简单,则可以通过滚动自己的单一操作员来摆脱。我要注意的是,BOOST.REGEX是库的少数几部分,实际上需要链接(而不是仅标头)。

至于整个结构的问题,我很抱歉,但是没有太多的人可以在这里做...如果您不知道进步的搜索。

如果您知道要提前寻找的参数,则可以创建适合执行此任务的多指数容器的特殊视图3个字符)。

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

其他提示

在您的特定情况下,您可以执行较低的_bound(“ foo”),然后向前走寻找比赛,直到击中不匹配或到达容器末端的东西为止。我认为没有一般的方法可以进行查找。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top