В этом примере повышение производительности не имеет большого смысла, если для обработки требуется всего около 10 слов, используйте более простой код. Однако есть несколько способов улучшить производительность.
Прежде всего, вы не хотите проверять наличие элемента в наборе. insert
возвращает вам пару iterator-bool, где первый - это итератор для элемента с ключом (существующим или новым), а второй - логическое значение, указывающее, произошла ли вставка.
if (string_history.insert(current_string).second)
output_string += " " + current_string;
Это упрощает код и повышает производительность. Как уже указывалось в комментариях, использование std::move
имеет смысл, однако, если вы используете его со вставкой, вам понадобится итератор для удержания перемещенного объекта. В этом случае это не поможет, как в случаях с единым входом.
Второе, что требует больше кода, это удалить std::stringstream
. Потоки дают некоторые накладные расходы. Вместо этого вы можете лучше принять std::string_view
и использовать подстроку logi c, чтобы разрезать его на части. Это предотвращает создание новых строковых объектов и устраняет накладные расходы из потоков. Вам нужен C ++ 17 (или библиотека, обеспечивающая это).
Наконец, вы можете зарезервировать output_string
в начале, вы знаете максимальный размер (он же размер str). Это может предотвратить перераспределение, если вы окажетесь вне диапазона SSO.