在Boost.MultiIndex数据结构中的通配符搜索?
-
20-09-2019 - |
题
我正在尝试通过减少数据库的往返来优化我的应用程序。作为这项工作的一部分,我一直在将一些表移动到内存中,将它们存储为 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”),然后向前走寻找比赛,直到击中不匹配或到达容器末端的东西为止。我认为没有一般的方法可以进行查找。
不隶属于 StackOverflow