每次迭代的字符串分配问题



我有一个类似" hello_1_world "的字符串。在每次迭代中,我想增加1;部分。"hello_2_world","hello_3_world"等等……所以我不能用const char*string_view。我必须在每次迭代中使用std::string分配新的内存。但是,我不想因为性能问题。你能提出一个解决办法吗?

我的代码如下所示。猜索引每次递增

std::string value{"hello_" + std::to_string(index) + "_world"};

我尝试了很多方法。其中一个是这样的:

string_view result(value, 39);

和concat something but again。不能修改string_view

你真的需要一个std::string,还是一个简单的char[]就足够了?如果是这样,那么尝试这样做:

// a 32bit positive int takes up 10 digits max...
const int MAX_DIGITS = 10;
char value[6 + MAX_DIGITS + 6 + 1];
for(int index = 0; index < ...; ++index) {
std::snprintf(value, std::size(value), "hello_%d_world", index);
// use value as needed...
}

或者,如果你不介意在数字中有前导零,那么你可以在每次迭代时只更新缓冲区的那一部分:

const int MAX_DIGITS = ...; // whatever you need, up to 10 max
char value[6 + MAX_DIGITS + 6 + 1];
std::strcpy(value, "hello_");
std::strcpy(&value[6 + MAX_DIGITS], "_world");
for(int index = 0; index < ...; ++index) {
std::snprintf(&value[6], MAX_DIGITS, "%0.*d", MAX_DIGITS, index);
// use value as needed...
}

如果您确实需要std::string,那么只需在迭代之前预先分配它,然后在迭代期间填充其现有内存,类似于char[]:

const int MAX_DIGITS = 10;
std::string value;
value.reserve(6 + MAX_DIGITS + 6); // allocate capacity
for(int index = 0; index < ...; ++index) {
value.resize(value.capacity()); // preset size, no allocation when newsize <= capacity
std::copy_n("hello_", 6, value.begin());
auto ptr = std::to_chars(&value[6], &value[6 + MAX_DIGITS], index).ptr;
/* or:
auto numWritten = std::snprintf(&value[6], MAX_DIGITS, "%d", index);
auto ptr = &value[6 + numWritten];
*/
auto newEnd = std::copy_n("_world", 6, ptr);
value.resize(newEnd - value.data()); // no allocation when shrinking size
// use value as needed...
}

或者,前导零:

const int MAX_DIGITS = ...; // up to 10 max
std::string value(6 + MAX_DIGITS + 6, '');
std::copy_n("hello_", 6, value.begin());
std::copy_n("_world", 6, &value[6 + MAX_DIGITS]);
for(int index = 0; index < ...; ++index) {
std::snprintf(&value[6], MAX_DIGITS, "%0.*d", MAX_DIGITS, index);
// use value as needed...
}

您可以使用std::stringstream来增量地构造字符串:

std::stringstream ss;
ss << "hello_";
ss << index;
ss << "_world";
std::string value = ss.str();

相关内容

  • 没有找到相关文章

最新更新