有时你需要填写
std::string
用C函数构造的字符。一个典型的例子是:
constexpr static BUFFERSIZE{256};
char buffer[BUFFERSIZE];
snprint (buffer, BUFFERSIZE, formatstring, value1, value2);
return std::string(buffer);
注意我们首先需要填充本地缓冲区,然后将其复制到
STD::字符串
.
如果计算最大缓冲区大小,并且不一定要在堆栈上存储某些内容,则示例会变得更复杂。例如:
constexpr static BUFFERSIZE{256};
if (calculatedBufferSize>BUFFERSIZE)
{
auto ptr = std::make_unique<char[]>(calculatedBufferSize);
snprint (ptr.get(), calculatedBufferSize, formatstring, value1, value2);
return std::string(ptr.get());
}
else
{
char buffer[BUFFERSIZE];
snprint (buffer, BUFFERSIZE, formatstring, value1, value2);
return std::string(buffer);
}
这使得代码更加复杂,如果计算的BufferSize大于堆栈上所需的大小,则基本上可以执行以下操作:
-
分配内存(使唯一)
-
用想要的结果填充内存
-
分配内存(std::string)
-
将内存复制到字符串
-
释放内存
自从C++ 17
STD::字符串
有非常量
data()
方法,这意味着这是操作字符串的方法。因此,这样做似乎很诱人:
std::string result;
result.resize(calculatedBufferSize);
snprint (result.data(), calculatedBufferSize, formatstring, value1, value2);
result.resize(strlen(result.c_str()));
return result;
我的实验表明,最后一次调整大小是必要的,以确保正确报告字符串的长度。
std::string::length()
不搜索nul终止符,它只返回大小(就像
std::vector
做)。
请注意,我们进行的分配和复制要少得多:
老实说,虽然它看起来效率更高,但在我看来也很“不标准”。有人能指出这是否是C++ 17标准所允许的行为?还是有其他的方法可以更有效地进行这种操作?
请不要提问题
Manipulating std::string
因为这个问题是关于更脏的逻辑(甚至使用
memset
)
也不要回答我必须使用C++流(
std::string_stream
效率高?老实说?).有时您只需要在C中有一个您想要重用的有效逻辑。