C ++ Как сохранить емкость строки при копировании

РЕДАКТИРОВАТЬ (оригинальный пост в истории редактирования)

Я могу воспроизвести мою проблему с этим примером:

#include <string>
#include <vector>
using namespace std;

#define MAX_BUFFER 30

int main(int argc, char **argv) {

vector<string> myVec = { "hey","asd","haha" };
vector<string> clone;

for (int i = myVec.size(); i--;) {
myVec[i].reserve(myVec[i].size() + MAX_BUFFER);
clone.push_back(myVec[i]);
}

return 0;
}

Добавить точку останова перед вернуть 0; . Теперь проверьте строки, которые есть в myVec и clone. Их вместимость не одинакова!

0

Решение

Емкость не требуется копировать, чтобы быть такой же, когда std::string копируется.

$ 21.3.1.2 / 2 basic_string конструкторы и операторы присваивания
[string.cons]
:

Table 49 — basic_string(const basic_string&) effects
Element   Value
data()    points at the first element of an allocated copy of the array whose first element is pointed at by str.data()
size()    str.size()
capacity()    a value at least as large as size()

Единственная гарантия — емкость строки будет, по крайней мере, такой же большой, как ее размер после копирования.

Это означает, что вы должны сделать это самостоятельно:

for (int i = myVec.size(); i--;) {
myVec[i].reserve(myVec[i].size() + MAX_BUFFER);
clone.push_back(myVec[i]);
clone.back().reserve(myVec[i].capacity());
}
3

Другие решения

Да, строковый класс имеет функцию-член
Функция изменения размера строки.

0

myString.resize(l) не изменит емкость строки, кроме случаев, когда l больше, чем размер строки. Просто позвони myString.capacity() и убедитесь сами.

0