В c-строках нам нужно выделить разумный размер памяти. Чтобы избежать перераспределения в строковых операциях, мы можем использовать что-то вроде Stringbuilder в C# или Java или - в C - просто выделяем больше памяти для строки. Но все же это может быть проблемой, если мы заранее не знаем требования к памяти. У нас есть какая-то реализация, как связанный список? Я имею в виду, чтобы выделить список блоков памяти и методы c_str()
, который создает с-строкой из ее узловC-string как связанный список?
liststring a(4); // requested block size
a.append("hello ");
a.append("world");
// should create three nodes, 4 bytes allocated for each
// "hell" -> "o wo" -> "rld"
a.c_str(); // "hello world";
Или мы используем другой подход, если мы хотим избежать перераспределений? Пожалуйста, объясните, если это плохая идея.
Когда вы вызываете c_str(), вам все равно нужно поместить строку в смежный буфер памяти, поэтому обычно считается, что с этой точки зрения это хорошая идея. Использование связанного списка блоков фиксированного размера также означает, что построение длинной строки будет тратить O (n) на распределение, тогда как обычная стратегия распределения по экспоненциальному увеличению для строк тратит O (log (n)) за счет потери большего объема памяти. –
Но если мы хотим добавить много раз, и мы не знаем, сколько и какого размера мы можем выделить слишком мало байтов (так нужно перераспределить) или слишком много (трата памяти). –
Существует алгоритм, гарантирующий не использовать память более чем в четыре раза длины строки, и каждое перераспределение занимает в среднем значение «O (1)». Если текущий размер буфера равен «n», а длина строки не заполнена буфером, необходимо перераспределить буфер размером «2 * n». Если он стал меньше, чем 'n/4', то буфер размером n/2 должен быть перераспределен. – citxx