【发布时间】:2011-08-11 23:54:57
【问题描述】:
如果我在一行上有一个由空格分隔的整数列表(例如:50 34 1 3423 5 345),那么将它们中的每一个设为单独的整数变量的最佳方法是什么 - 收集整数列表cin?
【问题讨论】:
如果我在一行上有一个由空格分隔的整数列表(例如:50 34 1 3423 5 345),那么将它们中的每一个设为单独的整数变量的最佳方法是什么 - 收集整数列表cin?
【问题讨论】:
#include <iostream>
#include <vector>
#include <iterator>
std::vector<int> ints;
std::copy(std::istream_iterator<int>(cin),
std::istream_iterator<int>(),
std::back_inserter(ints));
完成。如果你真的需要明确地逐行阅读:
#include <sstream>
#include <iostream>
#include <vector>
#include <iterator>
std::string singleline;
std::istringstream iss; // out of loop for performance
while (std::getline(cin, singleline))
{
iss.str(singleline);
std::copy(std::istream_iterator<int>(iss),
std::istream_iterator<int>(),
std::back_inserter(ints));
}
istream_iterator<int> 将重复地将operator>>(int&) 应用于引用的流(直到流结束)。默认情况下会默默忽略空格,如果输入操作失败(例如遇到非整数输入)会抛出异常
back_inserter 是一个输出迭代器,您可以将它与支持.push_back 操作的所有容器类型(如vector)一起使用。所以实际上用 STL 算法写在那里的内容类似于
std::vector<int> ints;
while (iss>>myint)
{
ints.push_back(myint);
}
【讨论】:
std::istream_iterator<int>(iss)..而不是std::istream_iterator<iss>(cin)。
在 sehe 的回答之后,这里是你如何做的更详细一点 (ahem)。
他使用的算法基本上在内部执行此操作。这个答案主要是为了清楚起见。
#include <iostream>
#include <vector>
int main()
{
std::vector<int> myInts;
int tmp;
while (std::cin >> tmp) {
myInts.push_back(tmp);
}
// Now `myInts` is a vector containing all the integers
}
【讨论】:
>> 在对int 有效的同时读取尽可能多的字符,然后停止。它还倾向于忽略空格,因此它会立即准备好提取下一个看起来像数字的子字符串。
查看strtok( ) 和atoi( ) 的手册页
【讨论】: