C ++ 14 - это хороший способ добавить символ в строку? - PullRequest
0 голосов
/ 05 июля 2018

Если я хочу добавить символ c в начало строки s, будет ли полезен следующий метод?

string s = "oo";
char c = 'f';
s = c + s;

В вопросе " Prepend std :: string " на SO ответы, предложившие сделать это, были менее хорошо приняты, чем верхний ответ, в котором предлагалось использовать функцию-член .insert().

Есть ли причина помимо эффективности (s = c + s неэффективна, поскольку все содержимое string s должно быть скопировано)?

Ответы [ 3 ]

0 голосов
/ 06 июля 2018

Операция s = c + s создаст временный объект, вероятно, динамически распределяющий память в куче. Выполните требуемую операцию добавления, а затем скопируйте ее обратно в строковую переменную. Больше операций и операций с памятью.

Операции с памятью, такие как выделение и удаление памяти, являются дорогостоящими. Вставка перераспределяет память, только если для строки недостаточно непрерывной памяти. В худшем случае это все равно будет соответствовать s = c + s подходу.

Хотя это не является большой проблемой для производительности (учитывая худший случай), она более элегантна и проста для понимания с точки зрения программистов.

0 голосов
/ 06 июля 2018

Обратите внимание, что ничто не мешает реализации строки разрешить ограниченное добавление на обоих концах без необходимости перемещения содержимого. Реализации по умолчанию этого не делают, но некоторые реализации могут зарезервировать дополнительное место в начале строки при первом добавлении, чтобы последующее добавление было «свободным». Есть векторные реализации, которые делают это там.

0 голосов
/ 06 июля 2018

Поскольку оба выполняют одну и ту же операцию, что может быть причиной помимо эффективности? c+s создаст временную строку, поэтому потребуется копия каждого символа в c и s и, возможно, выделение кучи. Затем временный объект будет перемещен в данный объект, для которого будет выделена текущая память (если есть). Это не дешевые операции.

В отличие от этого, insert будет только выполнять выделение кучи, если для нового персонажа недостаточно места. У вас все еще будет копирование, так как вы вставляете в начале. Но это все. Это так же эффективно, как и вставка в начало непрерывного массива.

...