РЕДАКТИРОВАТЬ (оригинальный пост в истории редактирования)
Я могу воспроизвести мою проблему с этим примером:
#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. Их вместимость не одинакова!
Емкость не требуется копировать, чтобы быть такой же, когда 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());
}
Да, строковый класс имеет функцию-член
Функция изменения размера строки.
myString.resize(l)
не изменит емкость строки, кроме случаев, когда l
больше, чем размер строки. Просто позвони myString.capacity()
и убедитесь сами.