C++ 如果我赢了';你不能清理小溪吗?
我在TopCoder中做了一个图形问题,不知何故,我的程序一直输出错误的答案,尽管我认为一切都应该正常。我花了好几个小时寻找我的逻辑中的错误,结果,问题出在其他地方。下面是一段我有疑问的代码:C++ 如果我赢了';你不能清理小溪吗?,c++,stringstream,C++,Stringstream,我在TopCoder中做了一个图形问题,不知何故,我的程序一直输出错误的答案,尽管我认为一切都应该正常。我花了好几个小时寻找我的逻辑中的错误,结果,问题出在其他地方。下面是一段我有疑问的代码: int x, y; stringstream ssx; stringstream ssy; for (int i = 0; i < connects.size(); i++){ neighbours.push_back(vector<int> ()); edges_cos
int x, y;
stringstream ssx;
stringstream ssy;
for (int i = 0; i < connects.size(); i++){
neighbours.push_back(vector<int> ());
edges_cost.push_back(vector<int> ());
ssx.str(connects[i]);
ssy.str(costs[i]);
while (ssx >> x && ssy >> y){
neighbours[i].push_back(x);
edges_cost[i].push_back(y);
}
// The problem lied here. Apparently without these 2 lines
// the program outputs wrong answer. Why?
ssx.clear();
ssy.clear();
}
intx,y;
stringstream ssx;
细流;
对于(int i=0;i>x&&ssy>>y){
邻居[i]。推回(x);
边缘成本[i]。向后推(y);
}
//问题就在这里。显然没有这两条线
//程序输出了错误的答案。为什么?
ssx.clear();
ssy.clear();
}
正如你在评论中看到的,我设法解决了这个问题。但我不明白为什么我需要清除这些流。如果我不这样做,到底会发生什么?一旦您从流中提取了所有数据并尝试读取“再多一个字符!”(对
int
的内置提取将尝试这样做,以确定是否有更多的数字要读取),其eof
位被设置
您正在通过更改其缓冲区的“内容”来使用流,这很好,但您也需要重置eof
位。这就是.clear()
所做的
要在一般情况下重复使用stringstream,请执行以下操作:
ss.str(""); // clears data
ss.clear(); // clears all error flag bits
(在您的例子中,您直接用新数据替换缓冲区,稍后使用.str(“newText!”)
,而不是编写.str(“”
),这很好。)
这很令人困惑,因为像
clear
这样的函数听起来好像要清除数据,但实际上没有。当您到达while
循环的末尾时,eof位(或另一个错误位,取决于您的输入)被设置在流上,这会导致所有后续操作失败,除非您清除它。当然,正如目前所写的,流超出了范围,没有执行任何操作,所以我不明白这有什么关系。我想可能缺少一些相关的代码。@5gon12eder:代码清楚地设置了流缓冲区,并在每次循环迭代期间从中提取…@T.C.请不要在注释中写答案。这种行为目前似乎很流行,但它确实是一种反模式。评论是为了要求澄清和斥责他人。@LightnessRacesinOrbit您是对的-代表我分析错误。删除多余的缩进,以避免其他人犯同样的错误。