如果地图很小或很少执行搜索,那么只需迭代地图并将每个键与正则表达式匹配.
否则:如果正则表达式仅用于某种类型的前缀搜索,则可以使用成员函数lower_bound有效地查找具有给定前缀的所有条目.例如,以下函数首先查找完全匹配的条目.如果不存在此类条目,则该函数返回具有匹配前缀的所有条目的范围.
using items = std::map<std::string, item>;
auto lookup(const items& items, const std::string& key)
-> std::pair<items::const_iterator, items::const_iterator>
{
auto p = items.lower_bound(key);
auto q = items.end();
if (p != q && p->first == key) {
return std::make_pair(p, std::next(p));
} else {
auto r = p;
while (r != q && r->first.compare(0, key.size(), key) == 0) {
++r;
}
return std::make_pair(p, r);
}
}
Run Code Online (Sandbox Code Playgroud)
否则:如果您必须处理正则表达式或通配符,那么您可以将这两种方法结合起来.首先搜索与成员函数完全匹配的条目find.如果不存在此类条目,则从正则表达式中提取常量前缀.前缀可能为空.使用member函数lower_bound查找带有该前缀的第一个条目.使用该前缀迭代所有条目,并测试正则表达式是否匹配.