我正在尝试通过减少到我的数据库的往返来优化我的应用程序。作为这项工作的一部分,我一直在将一些表移动到内存中,将它们存储为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;
}
有更好的方法吗?
答案 0 :(得分:1)
在您的特定情况下,您可以执行lower_bound(“foo”),然后向前走,寻找匹配项,直到您遇到不匹配或到达容器末尾的内容。我不认为有一般方法可以进行此查找。
答案 1 :(得分:1)
好吧,首先你实际上不必使用boost :: regex,如果通配符足够简单,你可以通过滚动你自己的一元运算符来逃避。我会注意到Boost.Regex是库中实际需要链接的少数部分之一(不是仅限标题)。
至于走整个结构的问题,我很抱歉,但是如果你不知道预付款中的搜索,那么你可以在这里做多少...
如果您事先知道要查找的参数,那么您可以创建一个适用于使用专用比较器/哈希器执行此任务的多索引容器的特殊视图(例如,仅适用于帐号前3个字符。)
如果您希望获得更多信息,请提供有关您要使用的通配符类型和具体情况的详细信息。