你如何清除stringstream变量?

Cod*_*nts 464 c++ stringstream

我已经尝试了几件事,

std::stringstream m;
m.empty();
m.clear();
Run Code Online (Sandbox Code Playgroud)

两者都不起作用.

Wil*_*lka 737

对于所有标准库类型,成员函数empty()是查询,而不是命令,即它意味着"你是空的吗?" 不要"请丢掉你的内容".

所述clear()成员函数从继承ios和用于清除流的错误状态,例如,如果一个文件流具有设定为错误状态eofbit(结束文件),则调用clear()将设置错误状态返回goodbit(无差错) .

用于清除a的内容stringstream,使用:

m.str("");
Run Code Online (Sandbox Code Playgroud)

是正确的,虽然使用:

m.str(std::string());
Run Code Online (Sandbox Code Playgroud)

在技​​术上更有效,因为你避免调用所std::string采用的构造函数const char*.但是现在任何编译器都应该能够在两种情况下生成相同的代码 - 所以我会选择任何更具可读性的代码.

  • 当你忘记"clear()"部分时会发生这种情况.http://stackoverflow.com/q/2848087/635549 (98认同)
  • @KshitijBanerjee我认为在C++中,m.str()和m.str("")是两个不同的函数.m.str()调用一个不期望任何参数的函数,而m.str("")将调用接受const char*参数的函数.m.str()可能已经实现为**get**函数,它返回字符串,而m.str("")可能已经实现为**set**函数. (8认同)
  • 正如Galath所说,添加m.clear()非常重要; 除了m.str("");.否则,如果在某些时候用字符串流填充字符串流,则可能会出现问题. (4认同)
  • 噢,天哪,这就是直觉。就像关于 C++ 的其他一切一样! (4认同)
  • 这是迄今为止我在 Stackoverflow 中遇到的最差接受度和最高票数的答案。在我的标准库实现中,重置后字符串流无法使用。只需使用 m=std::stringstream(); 从杰伦的回答来看。 (3认同)

Nik*_*iou 44

您可以清除错误状态并在一行中清空strignstream

std::stringstream().swap(m); // swap m with a default constructed stringstream
Run Code Online (Sandbox Code Playgroud)

这有效地将m重置为默认构造状态

  • @ 101010:如何交换比移动分配更好? (6认同)
  • 这是低效的。当我想重新使用原来的ss。它为我交换了一个空的。 (5认同)
  • GNU g ++ v4.8中仍缺少功能,请参阅http://stackoverflow.com/questions/24429441/c-compiler-does-not-recognize-stdstringstreamswap (4认同)
  • @AsetD:即使是noexcept,您是否忘记了默认构造的临时文件? (3认同)
  • @101010 正如张的评论所说,我希望这比调用 `m.str({})` 效率低得多。澄清:当你调用`m.str({})`时,我希望它会重用它在第一次操作期间分配的一些内存来加速下一次操作。当您调用 `std::stringstream().swap(m)` 时,我希望它在第一次操作期间分配的任何内存都将其所有权转移到您刚刚创建的临时对象,从而失去了提高效率的机会。不过,在实践中进行比较会很有趣。 (3认同)
  • 不妨只做 `m = std::stringstream();` 而不是与您要删除的对象交换 (3认同)
  • 与此处的所有其他答案相比,这是最有效和最优雅的方式.但是,std :: stringstream :: swap是一个c ++ 11特性,这个解决方案不适用于以前的c ++ 11编译器. (2认同)

Cod*_*nts 34

m.str("");
Run Code Online (Sandbox Code Playgroud)

似乎工作.

  • 似乎工作......流状态和ios标志怎么样? (10认同)
  • 这将由OP中指定的.clear()清除. (2认同)

小智 32

无论编译器如何,这应该是最可靠的方式:

m=std::stringstream();
Run Code Online (Sandbox Code Playgroud)

  • 这并不适合所有情况。这会每次都重新分配缓冲区,而 mm.str("") 不会。 (4认同)
  • 我刷新 stringstream 对象的主要用例是保留一个 threadlocal stringstream 对象,以防止 stringstream 不必要的实例化——实例化一个新的 stringstream 对象会复制全局 locale 对象——理论上这很快,只涉及增加一个原子,但是在我处理的并发级别上,它通常是严重的。 (3认同)
  • 我认为这更好,因为 m.str(""); 无论我尝试过什么,都导致我的 stringstream 被那个空值卡住了。但是使用这个我没有那个问题 (2认同)
  • 我遇到了同样的问题,对我来说'mm.clear(); mm.str("");`做了伎俩.(没有C++ 11,否则交换会更好). (2认同)

小智 12

我总是在考虑它:

{
    std::stringstream ss;
    ss << "what";
}

{
    std::stringstream ss;
    ss << "the";
}

{
    std::stringstream ss;
    ss << "heck";
}
Run Code Online (Sandbox Code Playgroud)


Fra*_*tes 10

我的2美分:

这似乎对我有用xcode和dev-c ++,我有一个菜单形式的程序,如果根据用户的请求迭代执行将填充一个stringstream变量,这将在第一次代码时正常工作运行,但下次用户运行相同的代码时不会清除字符串流.但是下面的两行代码最后在填充字符串变量之前每次清除stringstream变量.(2小时的试用和错误以及谷歌搜索),顺便说一句,使用每一行都不会做到这一点.

//clear the stringstream variable

sstm.str("");
sstm.clear();

//fill up the streamstream variable
sstm << "crap" << "morecrap";
Run Code Online (Sandbox Code Playgroud)