由于我熟悉C的I / O方面,我正在尝试编写一个程序来读取std :: cin中的一些整数行 . 说输入如下:
1 2 3
4 5 6
7 8 9
10 11 12
如何将上述线条读入2D矢量?
vector<vector<int>> nums;
/*
... some code here and nums will look like the following:
nums = {
{1,2,3},
{4,5,6},
{7,8,9},
{10,11,12}
}
*/
我也尝试将上面的整数行读成1D向量,但是我遇到了一些处理'\ n'字符的问题 . 我的代码是:
string rawInput;
vector<int> temp;
while(getline(cin, rawInput, ' ') ){
int num = atoi( rawInput.c_str() );
temp.push_back(num);
}
通过打印出“temp”向量中的所有元素得到的最终结果是:
1 2 3 5 6 8 9 11 12 // 4, 7, 10 went missing
任何帮助表示赞赏 . 谢谢 .
5 回答
令人惊讶的是,没有一个答案使用istream流运算符:http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/
当流为空时,设置eofbit,因此在其上运行while循环 .
适用于所有类型,并且可以为自定义类型(例如2D纹理)重载 .
你可以使用stringstream
发生的事情是因为你只使用''(空格)作为分隔符,输入恰好是
所以,你将
3\n4
,6\n7
等传递给atoi
它返回3,6等(atoi解析输入直到第一个非数字输入)并且4,7
丢失 .为了实现你想要的你想要你可以使用getline和istringstream(保持默认的分隔符为换行符)
我最近写了另一个问题的答案,但经过一些调整后,它完全符合您的要求(我希望):
示例实现:
首先使用getline来获取整行,然后你可以使用istringstream为该行创建一个
int
的流 .此时,只需使用带有两个迭代器的向量构造函数创建int的每个子向量 .
istringstream
上的istream_iterator<int>完成此操作: