Для оценки хранилища вам, вероятно, следует измерить строки, а не полагаться на жестко запрограммированную константу 20. Например:
size_t total = 0;
for (std::vector<std::string>::iterator it = v1_names.begin(); it != v1_names.end(); ++it) {
total += it->size() + 1;
}
Основная неэффективность в вашем цикле, вероятно, заключается в том, что вы берете дополнительную копию каждой строки по очереди: std::string val( v1_names[i] );
может вместо этого быть const std::string &val = v1_names[i];
.
Чтобы добавить каждую строку, вы можете использовать функцию insert
:
v2_names.insert(v2_names.end(), val.begin(), val.end());
v2_names.push_back(0);
Это не обязательно самый эффективный вариант, поскольку в векторе есть определенная избыточная проверка доступного пространства, но это не должно быть слишком плохо и просто. Альтернативой может быть размер v2_names
в начале, а не резервирование места, а затем копировать данные (с std::copy
), а не добавлять их. Но любой из них может быть быстрее, и это не должно иметь большого значения.
По основному вопросу, если все, что у вас есть, это v2_names
, и вы хотите напечатать строки, вы можете сделать что-то вроде этого:
const char *p = &v2_names.front();
while (p <= &v2_names.back()) {
std::cout << p << "\n";
p += strlen(p) + 1;
}
Если у вас также есть name_len
:
size_t offset = 0;
for (std::vector<int>::iterator it = name_len.begin(); it != name_len.end(); ++it) {
std::cout << &v2_names[offset] << "\n";
offset += *it + 1;
}
Помните, что тип name_len
технически неверен - не гарантируется, что вы можете хранить длину строки в int
. Тем не менее, даже если int
меньше size_t
в конкретной реализации, такие большие строки все равно будут довольно редкими.