Поиск соответствия шаблону регулярных выражений по неупорядоченной карте в cpp - PullRequest
0 голосов
/ 27 июня 2018

У меня есть unordered_map, его ключ и значения имеют строковый тип.

ключ - регулярное выражение.

Количество элементов на карте составляет около 2,50000.

Мне нужно найти элемент, чей ключ (регулярное выражение) возвращает ровно одно совпадение со строкой, полученной в запросе.

Когда я перебираю карту по каждому элементу, в худшем случае это занимает около 10 секунд.

Мой пример кода:

string string_to_match = "Find my Regex";
for (MyMap::const_iterator it = myMap.begin();
        it != myMap.end(); ++it) {
    //cout << it->first << "\n";
    if (regex_match( string_to_match ,
            regex(it->first,std::regex::ECMAScript | std::regex::icase))) {
        cout << ", " << it->second << "\n ";
        break;
    }
    ++it;
}

Можно ли как-нибудь сократить время, затрачиваемое ...

1 Ответ

0 голосов
/ 27 июня 2018

Создание объекта std::regex занимает много времени, потому что входная строка регулярного выражения компилируется во время построения. Поэтому заранее создайте std::regex объекты и храните их в выбранном вами контейнере.

Вызов std::regex_match для предварительно скомпилированного объекта std::regex очень эффективен.

Подумайте также о передаче флага std::regex::optimize при создании объекта std::regex. Это будет означать еще более медленную конструкцию, но еще более высокую производительность сопоставления.

...