【发布时间】:2009-10-06 15:58:40
【问题描述】:
我正在尝试通过减少对数据库的往返次数来优化我的应用程序。作为这项工作的一部分,我一直在将一些表移动到内存中,并将它们存储为 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;
}
有没有更好的办法?
【问题讨论】:
-
我对 MySQL 不熟悉,但是您是否认为当您使用通配符进行这样的过度特定搜索时,会与使用正则表达式的线性搜索有所不同? (我对此表示怀疑)。您也可以制作自己的函数来包装此行为,例如
auto search_by_name(boost::regex e, multi_index_type m_table){ ...; return match;}
标签: c++ mysql boost wildcard boost-multi-index