How do you clear a stringstream variable?
我已经试过几次了,
1 2 3
| std::stringstream m;
m.empty();
m.clear(); |
这两个都不起作用。
对于所有标准库类型,成员函数empty()是一个查询,而不是一个命令,即它的意思是"你是空的吗?"不是"请扔掉你的东西"。
clear()成员函数继承自ios并用于清除流的错误状态,例如,如果文件流的错误状态设置为eofbit(文件结束),则调用clear()将错误状态设置回goodbit(无错误)。
用于清除stringstream的内容,使用:
是正确的,尽管使用:
技术上更有效,因为您避免调用采用const char*的std::string构造函数。但是现在的任何编译器都应该能够在这两种情况下生成相同的代码——所以我只使用更具可读性的代码。
- 下面是当您忘记"clear()"部分时发生的情况。stackoverflow.com/q/2848087/635549
- 为什么m.str()返回字符串值但不清除流?
- 我认为C++中的KshitijBanerjee(Stand)和M.STR("")是两个不同的函数。m.str()调用一个不需要任何参数的函数,而m.str(")将调用接受const char*参数的函数。m.str()可能实现为返回字符串的get函数,而m.str(")可能实现为set函数。
- 以下链接整齐地记录了str en.cppreference.com/w/cpp/io/basic_stringstream/str的两个版本
- 正如Galath所说,除了m.str(")之外,添加m.clear()也是非常重要的。否则,如果在某个时刻用空字符串填充stringstream,则可能会出现问题。
- 奇怪的事情发生了。在用str(")清除了一个stringstream之后,无法用更多的数据设置stringstream>例如:std::stringstream ss;ss<"test";ss.str(");ss<"test2";在最后一个语句之后,ss为空。
- @詹姆斯,这真的是你的全部背景吗?您的代码片段在这里按预期工作:wandbox.org/permlink/px6iszbfnpaejfyw
- @是的,那是去年。从那以后我就开始工作了。
您可以清除错误状态并在一行中清空strignstream
1
| std::stringstream().swap(m); // swap m with a default constructed stringstream |
这有效地将m重置为默认构造状态
- 与所有其他答案相比,这是最有效和最优雅的方法。但是,STD::StrugStudio::SWAP是C++ 11的特性,这个解决方案对于以前的C++ 11编译器来说是行不通的。
- GNU G++v4.8中仍然缺少该功能,请参阅stackoverflow.com/questions/24429441/&hellip;
- @如何交换比移动分配更好?
- @重复数据消除程序-交换不例外
- @asetd:即使它是noexcept,您是否忘记了默认的临时构造?
- 这是低效的。当我想重新使用原SS时。它替我换了一个空的。
- @2010年10月10日,正如张的评论所说,我希望这比打电话给m.str({})效率低得多。澄清:当您调用m.str({})时,我希望它会重用在第一次操作期间分配的一些内存,以加速下一次操作。当您调用std::stringstream().swap(m)时,我希望它在第一次操作期间分配的任何内存都会将其所有权转移到您刚刚创建的临时内存中,从而失去实现该效率的机会。不过,在实践中看到比较是很有趣的。
似乎起作用了。
- 似乎有效…流状态和iOS标志如何?
- 这将由在op中指定的.clear()清除。
无论编译器如何,这都应该是最可靠的方法:
- 在我看来,这更好,因为m.str(");无论我尝试什么,都会导致我的stringstream被这个空值卡住。但是用这个我没问题
- 我也遇到了同样的问题,对我来说,mm.clear(); mm.str("");就是这么做的。(没有C++ 11,否则交换会更好)。
- @霍克:为什么swap比移动任务更好?
- 我想也可以。如果性能很重要,您可能需要检查哪个更快,并相应地进行选择。
- 几乎可以肯定的是最快和最好的答案,但需要C++ 11。
- 这对所有情况都不好。这将每次重新分配缓冲区,而mm.str(")不会。
- 我刷新Stringstream对象的主要用例是保留一个线程本地Stringstream对象,以防止不必要的Stringstream实例化--实例化一个新的Stringstream对象复制全局区域设置对象--理论上这是快速的,只涉及增加一个原子,但在并发级别上,我需要用它来磨练常常是残废的。
- use of deleted function ‘std::basic_stringstream& std::basic_stringstream::operator=(const std::basic_stringstream&)
我一直在审视它:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| {
std::stringstream ss;
ss <<"what";
}
{
std::stringstream ss;
ss <<"the";
}
{
std::stringstream ss;
ss <<"heck";
} |
我的2分钱:
在xcode和dev-c++中,这似乎对我有用,我有一个菜单形式的程序,如果按照用户的请求迭代执行,它将填充一个stringstream变量,该变量在代码第一次运行时可以正常工作,但下次用户运行相同代码时不会清除stringstream。但是下面的两行代码在填充字符串变量之前,每次最后都会清除stringstream变量。(2小时的试错和谷歌搜索),顺便说一句,单独使用每一行不会有什么效果。
1 2 3 4 5 6 7
| //clear the stringstream variable
sstm.str("");
sstm.clear();
//fill up the streamstream variable
sstm <<"crap" <<"morecrap"; |
这是一个概念问题。
Stringstream是一个流,因此其迭代器是向前的,无法返回。在输出字符串流中,需要使用flush()重新初始化它,就像在任何其他输出流中一样。
- en.cppreference.com/w/cpp/io/basic ou ostream/flush flush与关联的存储设备同步。这与重新初始化不同。
这些不会丢弃GNU C++中的STRIGSTATH流中的数据。
1 2 3
| m.str("");
m.str() ="";
m.str(std::string()); |
以下内容确实为我清空了Stringstream:
- 我不太确定这会起作用,因为同样的原因,Bernhardrusch不会起作用。.str()函数返回一个副本,清除该副本不会做任何事情。
- 这个解决方案对于微软Visual C++来说是行不通的。
- -1:这是完全错误的。
- 不正确。clear将对从流返回的字符串(而不是流本身)进行操作。