2014-01-13 4 views
0

Использование класса станд :: строки в C++, можно изменить характер с использованием нотации массива, например:Строки в C++ скопированы при изменении?

std::string s = "Hello"; 
s[0] = 'X'; 
cout << s << '\n'; 

Я проверил, что этот код компилируется и печатает «Xello», как и ожидалось. Однако мне было интересно, какова стоимость этой операции: постоянное время или O (n), потому что строка копируется?

+0

Постоянно, вы изменяете буфер непосредственно. Фактически копирование цельной строки под cx11 должно быть O (n), поскольку оно использует семантику перемещения. – Samuel

+0

в C++ 11 '' 'имеет свою копию строки с момента ее создания. C++ 03 позволяет * копировать при записи *, поэтому это зависит от реализации. – juanchopanza

+0

Нет никакого копирования, связанного с этим кодом. У нас есть только инициализация и назначение. –

ответ

1

Вы можете изменить строку stl, как в примере, никакая копия не будет выполнена. Стандартный класс строк библиотеки не управляет пулом строк, как для других языков, для строк (например, Java). Эта операция является постоянной по сложности.

0

Строка не копируется. Внутренние данные напрямую изменены.

Он в основном получает внутренний указатель данных фактической строки и изменяет его. Представьте себе следующее:

char *data = &str[0]; 
for(size_t i = 0; i < str.size(); ++i) 
{ 
    data[i] = '!'; 
} 

Код устанавливает каждый символ строки восклицательным знаком. Но если строка была скопирована, то после первой записи указатель данных станет недействительным.

Или другой пример: СТД :: соиЬ < < ул [5] < < станд :: ENDL;

Это печатает 6-й символ строки. Почему бы это копия строка? C++ не может определить разницу между char c = str[5] и str[5] = c (за исключением того, что const и non-const вызовы функций идут).

Кроме того, str [n] гарантированно никогда не будет генерировать исключения, если n < str.size(). Он не может сделать эту гарантию, если ей придется выделять внутреннюю память для копии - потому что распределение может потерпеть неудачу и бросить.

(Как @juanchopanza упоминалось, старые стандарты C++ разрешены КОРОВА строк, но последний C стандарт ++ запрещает это)

0

Вы изменить только первый элемент s[0], поэтому он не может быть O (п). Вы не копируете строку.

+1

Неверная логика. При реализации COW (теперь запрещенной) изменение одного элемента приводит к копированию по записи (по определению), и эта копия определенно равна O (n). – MSalters

Смежные вопросы