マップが小さいか、検索がめったに実行されない場合は、マップを反復処理して、各キーを正規表現と照合します。
それ以外の場合:正規表現がある種のプレフィックス検索にのみ使用される場合、メンバー関数を使用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);
}
}
それ以外の場合:正規表現またはワイルドカードに対処する必要がある場合は、2 つのアプローチを組み合わせることができます。最初に、メンバー関数と完全に一致するエントリを検索しますfind
。そのようなエントリが存在しない場合は、正規表現から定数プレフィックスを抽出します。プレフィックスは空である可能性があります。メンバー関数lower_bound
を使用して、そのプレフィックスを持つ最初のエントリを見つけます。そのプレフィックスを持つすべてのエントリを繰り返し処理し、正規表現が一致するかどうかをテストします。