У меня есть 4e7 std::string
s, каждая длиной от 3 до 30 символов, со многими дубликатами. Я помещаю их в std::set
.
Вызов set::insert
для каждой строки становится невыносимо медленным задолго до того, как он завершится примерно с 1e7 уникальными строками. Поэтому вместо этого я push_back
разбиваю каждую строку на vector
, sort()
и unique()
, а затем переместите строки в set
.
Он по-прежнему медленный, но, по крайней мере, он завершает: 4 секунды для накопления вектора, еще 30 для sort()
, еще 3 для unique()
.
Узким местом является sort()
. Но мне не нужно, чтобы строки были лексикографически отсортированы! Мне просто нужно, чтобы повторяющиеся строки были непрерывными, для unique()
. Их порядок не имеет значения. Есть ли более простая и быстрая функция сравнения строк для sort()
, которую я мог бы использовать вместо функции по умолчанию?
Или я должен построить набор быстрее, перебирая вектор с хеш-таблицей сбоку, чтобы пропустить дубликаты? Или заменить set
на hash_set
или unordered_set
?
Редактировать: я собираю Linux с помощью g++ 4.8.4 с единственными флагами -std=c++11 -O3
.
std::unordered_set
. - person Some programmer dude   schedule 08.08.2019std::unordered_set
(из сторонней библиотеки для хэш-наборов, если вам нужна дополнительная производительность.std::unordered_set
ограничена в том, насколько производительной она может быть из-за требований ее интерфейса) - person Alecto Irene Perez   schedule 08.08.2019std::string
, например, наchar[32]
или что-то подобное. Избегание выделения кучи может обеспечить значительное ускорение. - person Jeremy Friesner   schedule 09.08.2019