Clang Tidy жалуется на push_back в вектор в цикле - PullRequest
1 голос
/ 10 апреля 2020

Вот мой код (работает нормально) и жалоба IDE: enter image description here Я попытался установить размер вектора с помощью vector<string> result(tmp.size());, но после этого результат будет содержать tmp.size() количество пустых строк в спереди, и я не хочу использовать insert.

Есть ли лучший способ обойти это?

1 Ответ

4 голосов
/ 10 апреля 2020

" предварительное выделение " здесь означает не изменение размера вектора до конечного размера, как это делает vector<string> result(tmp.size());, а резерв память для окончательного размера:

vector<string> result;
result.reserve(tmp.size());

Как уже упоминалось в комментариях, это просто означает оптимизацию производительности. Это не меняет поведение кода. Вызов reserve вызовет выделение блока памяти, достаточно большого для хранения окончательного размера вектора, но пока не создаст ни одного из элементов, что все равно будет сделано с push_back.

Это оптимизация производительности, потому что в противном случае окончательный размер неизвестен вектору, и поэтому может потребоваться перераспределить блоки памяти несколько раз в течение l oop, что (асимптотически для больших размеров) увеличит время, которое занимает l oop постоянным фактором, если предположить, что длина строк ограничена, а вызов mph->getValue() равен O(1), в противном случае эффект будет менее значительным.

...