Answers:
对于所有标准库类型,成员函数empty()
都是查询,而不是命令,即表示“您是空的吗?” 而不是“请扔掉您的内容”。
所述clear()
成员函数从继承ios
并且被用于清除流,例如的错误状态,如果一个文件流具有错误状态设定到eofbit
(结束文件),则调用clear()
将设置错误状态返回goodbit
(无差错) 。
要清除的内容stringstream
,请使用:
m.str("");
是正确的,尽管使用:
m.str(std::string());
从技术上讲效率更高,因为可以避免调用take的std::string
构造函数const char*
。但是,如今,任何一种编译器在两种情况下都应该能够生成相同的代码-因此,我将只使用可读性更高的代码。
您可以清除错误状态并清空一行字符串流
std::stringstream().swap(m); // swap m with a default constructed stringstream
这有效地将m重置为默认的构造状态
无论使用哪种编译器,这都应该是最可靠的方法:
m=std::stringstream();
mm.clear(); mm.str("");
做到了。(没有C ++ 11,否则交换会更好)。
swap
比移动分配更好?
我的2美分:
这似乎在xcode和dev-c ++中对我有用,我有一个菜单形式的程序,如果按照用户的要求迭代执行,它将填充一个stringstream变量,该变量在第一次执行该代码时就可以正常工作运行,但下次用户将运行相同的代码时不会清除字符串流。但是下面的两行代码最终每次都会在填充字符串变量之前清除stringstream变量。(2小时的反复试验和Google搜索),顺便说一句,单独使用每一行都无法解决问题。
//clear the stringstream variable
sstm.str("");
sstm.clear();
//fill up the streamstream variable
sstm << "crap" << "morecrap";
这是一个概念上的问题。
Stringstream是一个流,因此其迭代器是正向的,不能返回。在输出字符串流中,与其他任何输出流一样,您需要flush()重新初始化它。