我正在尝试通过减少对我的数据库的往返来优化我的应用程序。作为这项工作的一部分,我一直在将一些表移动到内存中,并将它们存储为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;
}
有没有更好的办法?