使用迭代器读取输入
Using iterator to read input
我有下面的代码,它有sin_start(cin)
的功能。我不确定 C++ 中是否定义了任何此类函数,或者我是否需要自己定义它。但是这段代码也能以某种方式编译和运行。
#include <iostream>
#include <iterator>
using namespace std;
int main()
{
cout << "Enter integers: ";
istream_iterator<int> sin_start(cin);
}
代码可以编译,因为它是有效代码。它只是没有做任何有意义的事情。
sin_start
不是函数,它是istream_iterator<int>
类型的变量,其中istream_iterator
是在<iterator>
头文件中定义的模板class文件。它将 std::cin
作为参数传递给其构造函数,因此它知道要从哪个流读取数据。
但代码只是在构造该变量后退出。它没有尝试读取任何数据。为此,尝试更像这样的东西:
#include <iostream>
#include <iterator>
using namespace std;
int main() {
cout << "Enter integers: ";
istream_iterator<int> sin_start(cin), end;
while (sin_start != end) {
int value = *sin_start++;
// do something with value...
}
}
这将读取整数,直到用户取消终端上的输入。
但是,在评论中,您提到您想要读取整数,直到用户改为按下 Enter。在这种情况下,您需要一种不同的方法,因为 istream_iterator
在内部使用 operator>>
,它会在每次读取时跳过前导空格,并且 Enter 被视为空格。尝试更像这样的东西:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main() {
cout << "Enter integers: ";
string line;
getline(cin, line);
istringstream iss(line);
int value;
while (iss >> value) {
// do something with value...
}
}
我有下面的代码,它有sin_start(cin)
的功能。我不确定 C++ 中是否定义了任何此类函数,或者我是否需要自己定义它。但是这段代码也能以某种方式编译和运行。
#include <iostream>
#include <iterator>
using namespace std;
int main()
{
cout << "Enter integers: ";
istream_iterator<int> sin_start(cin);
}
代码可以编译,因为它是有效代码。它只是没有做任何有意义的事情。
sin_start
不是函数,它是istream_iterator<int>
类型的变量,其中istream_iterator
是在<iterator>
头文件中定义的模板class文件。它将 std::cin
作为参数传递给其构造函数,因此它知道要从哪个流读取数据。
但代码只是在构造该变量后退出。它没有尝试读取任何数据。为此,尝试更像这样的东西:
#include <iostream>
#include <iterator>
using namespace std;
int main() {
cout << "Enter integers: ";
istream_iterator<int> sin_start(cin), end;
while (sin_start != end) {
int value = *sin_start++;
// do something with value...
}
}
这将读取整数,直到用户取消终端上的输入。
但是,在评论中,您提到您想要读取整数,直到用户改为按下 Enter。在这种情况下,您需要一种不同的方法,因为 istream_iterator
在内部使用 operator>>
,它会在每次读取时跳过前导空格,并且 Enter 被视为空格。尝试更像这样的东西:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main() {
cout << "Enter integers: ";
string line;
getline(cin, line);
istringstream iss(line);
int value;
while (iss >> value) {
// do something with value...
}
}