Функции std::string'scapacity(),reserve() и resize()

Я хочу использовать std::string просто для создания динамического буфера, а затем перебирать его с помощью индекса. Является ли resize() единственной функцией для фактического выделения буфера?

Я пробовал использовать функцию backup(), но когда я пытаюсь получить доступ к строке через индекс, она утверждает. Также, когда емкость строки по умолчанию составляет 15 байт (в моем случае), но если я все еще не могу получить к ней доступ как my_string[1].

Значит, емкость строки не является фактическим буфером? Кроме того, backup() также не выделяет фактический буфер?

string my_string;

// I want my string to have 20 bytes long buffer
my_string.reserve( 20 );

int i = 0;

for ( parsing_something_else_loop )
{
    char ch = <business_logic>;

    // store the character in 
    my_string[i++] = ch; // this crashes
}

Если я делаю resize() вместо backup(), то все работает нормально. Как получается, что строка имеет емкость, но не может получить к ней доступ с помощью []? Разве не в этом смысл резервного() размера, чтобы вы могли получить к нему доступ?

Дополнение В ответ на ответы я хотел бы спросить людей из stl: зачем кому-то использовать резерв(), когда resize() делает то же самое, а также инициализирует строку? Должен сказать, что в данном случае я не очень ценю аргумент производительности. Все, что resize() делает в дополнение к тому, что делает Reserve(), это то, что он просто инициализирует буфер, что, как мы знаем, всегда приятно делать в любом случае. Можем ли мы проголосовать за Reserve() с острова?

19
задан zar 1 March 2012 в 18:54
поделиться