可以丢弃std::stringstream的最后一个字符吗?



这就是我想要做的。

int main(int argc, char* argv[])
{
std::stringstream ss;
ss << "12345";
ss.seekp(-1, std::ios::end);
ss << '';
assert(ss.str() == "1234");     // nope!
return 0;
}

这个问题看起来像一个重复,但答案是关于写一个令牌序列,而不是真正解决原来的问题。

我能想到的最好的是

std::string contents = std::move(ss).str();
contents.resize(contents.size() - 1); // assumes size() > 0 !!
ss.str(std::move(contents));

请注意,这与注释中的解决方案不同:明智地选择函数和重载应该避免重新分配缓冲区和复制内容。(ss.str()是一个副本,contents.substr(...)是一个副本,ss.str(contents)是一个副本。)请注意,这需要c++ 20,例如Clang的libc++似乎还没有更新。

最新更新