将输入输入向量的优雅解决方案<int>
Elegant solution to take input to a vector<int>
我正在尝试创建一个 vector <int>
其大小未预先定义。只要输入终端中有数字,它就应该输入数字,并且当我点击 Enter
时应该停止读取。我尝试了很多解决方案,包括给定的 here and here。在第二种情况下,我可以输入一个非整数来终止对向量的输入。如果我使用第一个解决方案(下面添加的代码),它会无限期地监听输入。
代码:
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <iterator>
using std::cout;
using std::cin;
using std::vector;
using std::string;
using std::istringstream;
int main()
{
//cout << "Enter the elements of the array: \n";
//vector <int> arr ( std::istream_iterator<int>( std::cin ), std::istream_iterator<int>() );
vector <int> arr;
string buf;
cout << "Enter the elements of the array: \n";
while(getline(cin, buf))
{
istringstream ssin(buf);
int input;
while(ssin >> input)
{
arr.push_back(input);
}
}
cout << "The array: \n";
for(size_t i = 0; i < arr.size(); i++)
{
cout << arr[i] << " ";
}
return 0;
}
1)感觉输入一个字符或者一个很大的数字结束听输入不是很优雅。但是,istringstream
的解决方案似乎是可行的方法。我不确定为什么它不起作用。
2) 有什么方法可以从键盘检测到 Enter
以终止监听输入吗?我尝试使用 cin.get()
,但它改变了向量中的数字。
3) 还有其他方法或建议吗?
请查看@LearningC 和@M.M的评论。
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <iterator>
using std::cout;
using std::cin;
using std::vector;
using std::string;
using std::istringstream;
int main()
{
vector <int> arr;
string buf;
int input;
cout << "Enter the elements of the array: \n";
getline(cin, buf);
istringstream ssin(buf);
while(ssin >> input)
{
arr.push_back(input);
}
cout << "The array: \n";
for(size_t i = 0; i < arr.size(); i++)
{
cout << arr[i] << " ";
}
return 0;
}
让我们一步一个脚印。
我们要阅读直到按下 enter。这意味着您可能想使用 std:getline
来阅读一行。
然后你想解析它,所以你想把这行放到一个istringstream
.
然后你想读数字。当您阅读它们时,您显然想要忽略数字以外的任何内容,并且即使您遇到一组无法转换为数字的数字,您也想继续阅读。
还有一些事情不是很清楚,例如如何处理太大而无法转换的输入?你想跳到下一个吗?你想把一些数字读成一个数字,然后把剩下的数字读成另一个数字吗?
同样,如果你得到类似“123a456”的信息,你想做什么?是否应该完全跳过它,读作“123”(并且 "a456" 被忽略)?是否应该读作“123”和“456”,而只忽略 "a"?
现在让我们假设我们要读取 space 分隔的字符组,并将所有这些转换为我们可以转换的数字。如果某物太大而无法转换为数字,我们将忽略它(全部)。如果我们有一个像“123a456”这样的组,我们会将“123”读作一个数字,并忽略 "a456".
为此,我们可以这样做:
std::string line;
std::getline(infile, line);
std::istringstream input(line);
std::string word;
std::vector<int> output;
while (input >> word) {
try {
int i = std::stoi(word);
output.push_back(i);
}
catch (...) {}
}
例如,给定如下输入:“123a456 321 1111233423432434342343223344 9”,这将读入 [123, 321, 9]。
当然,我只是猜测您的要求,我并没有努力让它变得特别干净或优雅——只是对一组可能的要求的直接实现。
我正在尝试创建一个 vector <int>
其大小未预先定义。只要输入终端中有数字,它就应该输入数字,并且当我点击 Enter
时应该停止读取。我尝试了很多解决方案,包括给定的 here and here。在第二种情况下,我可以输入一个非整数来终止对向量的输入。如果我使用第一个解决方案(下面添加的代码),它会无限期地监听输入。
代码:
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <iterator>
using std::cout;
using std::cin;
using std::vector;
using std::string;
using std::istringstream;
int main()
{
//cout << "Enter the elements of the array: \n";
//vector <int> arr ( std::istream_iterator<int>( std::cin ), std::istream_iterator<int>() );
vector <int> arr;
string buf;
cout << "Enter the elements of the array: \n";
while(getline(cin, buf))
{
istringstream ssin(buf);
int input;
while(ssin >> input)
{
arr.push_back(input);
}
}
cout << "The array: \n";
for(size_t i = 0; i < arr.size(); i++)
{
cout << arr[i] << " ";
}
return 0;
}
1)感觉输入一个字符或者一个很大的数字结束听输入不是很优雅。但是,istringstream
的解决方案似乎是可行的方法。我不确定为什么它不起作用。
2) 有什么方法可以从键盘检测到 Enter
以终止监听输入吗?我尝试使用 cin.get()
,但它改变了向量中的数字。
3) 还有其他方法或建议吗?
请查看@LearningC 和@M.M的评论。
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <iterator>
using std::cout;
using std::cin;
using std::vector;
using std::string;
using std::istringstream;
int main()
{
vector <int> arr;
string buf;
int input;
cout << "Enter the elements of the array: \n";
getline(cin, buf);
istringstream ssin(buf);
while(ssin >> input)
{
arr.push_back(input);
}
cout << "The array: \n";
for(size_t i = 0; i < arr.size(); i++)
{
cout << arr[i] << " ";
}
return 0;
}
让我们一步一个脚印。
我们要阅读直到按下 enter。这意味着您可能想使用 std:getline
来阅读一行。
然后你想解析它,所以你想把这行放到一个istringstream
.
然后你想读数字。当您阅读它们时,您显然想要忽略数字以外的任何内容,并且即使您遇到一组无法转换为数字的数字,您也想继续阅读。
还有一些事情不是很清楚,例如如何处理太大而无法转换的输入?你想跳到下一个吗?你想把一些数字读成一个数字,然后把剩下的数字读成另一个数字吗?
同样,如果你得到类似“123a456”的信息,你想做什么?是否应该完全跳过它,读作“123”(并且 "a456" 被忽略)?是否应该读作“123”和“456”,而只忽略 "a"?
现在让我们假设我们要读取 space 分隔的字符组,并将所有这些转换为我们可以转换的数字。如果某物太大而无法转换为数字,我们将忽略它(全部)。如果我们有一个像“123a456”这样的组,我们会将“123”读作一个数字,并忽略 "a456".
为此,我们可以这样做:
std::string line;
std::getline(infile, line);
std::istringstream input(line);
std::string word;
std::vector<int> output;
while (input >> word) {
try {
int i = std::stoi(word);
output.push_back(i);
}
catch (...) {}
}
例如,给定如下输入:“123a456 321 1111233423432434342343223344 9”,这将读入 [123, 321, 9]。
当然,我只是猜测您的要求,我并没有努力让它变得特别干净或优雅——只是对一组可能的要求的直接实现。