我有一个类似" 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();