//Wrong Code
#include<iostream>
#include<iterator>
using namespace std;
int main(){
istream_iterator<string> in_iter(cin),eof;
ostream_iterator<string> out_iter(cout," ");
while(in_iter!=eof)
*out_iter++ = *in_iter++;
}输入:(在交互模式中通过"visual c++"、"cpp.sh"、"onlinegdb“和任何您喜欢的工具运行上面的代码.)
aa bb cc 6 dd ee输出:
aa bb cc 6 dd实际上正确的代码应该是:
#include<iostream>
#include<iterator>
using namespace std;
int main(){
istream_iterator<string> in_iter(cin),eof;
ostream_iterator<string> out_iter(cout," ");
while(in_iter!=eof){
*out_iter = *in_iter;
out_iter++;
in_iter++;
}
}输入:
aa bb cc 6 dd ee输出:
aa bb cc 6 dd eeDescription:非常简单的代码。只是为了打印一些字符和输出将是相同的。然而,在"C++入门“一书中,如下图所示,它给了我们错误的代码。这是C++的错误,还是"C++ Primer“的错误?"C++底座“图片
发布于 2020-06-16 11:46:13
让我们拆开这个命令,看看发生了什么:
*out_iter++ = *in_iter++;根据运算符优先,它也可以用以下方式编写
// read next value, but return unmodified iterator (with the previous value)
// the first value is read when the iterator is constructed!
auto x = in_iter++;
// get value that was previously read
const auto res = *x;
// print this value
*out_iter++ = res;因此,基本上,它只在读取下一个值之后才会打印一个值。对于"a b c"的输入,会发生以下情况:
istream_iterator<string> in_iter(cin)读取"a"auto x = in_iter++;读取"b",但返回包含"a"的迭代器const auto res = *x;的结果是"a",然后打印出来。auto x = in_iter++;读取"c",但返回包含"b"的迭代器const auto res = *x;的结果是"b",然后打印出来。auto x = in_iter++;尝试读取某些内容,但是流缓冲区是空的,因此它等待进一步的输入。到目前为止,只有"a b"被打印出来,"c"在in_iter中被“卡住”。
如果流包含[eof] (例如,如果以某种方式终止流),则步骤6将不同,步骤7(和步骤8)将发生如下情况:
auto x = in_iter++;读取[eof],成为eof迭代器,并返回包含"c"的迭代器。const auto res = *x;的结果是"c",然后打印出来。因此,这段代码并没有错,它只是没有做人们直觉所期望的事情。
另一方面,您的代码执行以下操作:
// extract first value that was read by the constructor and "prepare" to print
*out_iter = *in_iter;
// read next value
out_iter++;
// print value
in_iter++;这与预期的一样,因为它在读取新值之前确实会打印旧值。
https://stackoverflow.com/questions/62404115
复制相似问题