未知输入大小 cin
Unknown input size cin
我确定这是一个简单的问题。老实说,这应该是编写 SAT 求解器最简单的部分,但是,我应该让用户输入这样的数据:
Sample Input:
1 <-- 1st number denotes the number of cases I will have
5 <-- 2nd number represents the number of variables, followed
1 2 3 who knows how many clauses.
-1 3 4
-2 -3 5
-5 -1 2
-4 1 -2
-4 -1 -2 -3 -5
*blank line separates the different cases*
.... followed by as many cases as the user said they had
所以,我将这些子句存储到字符串向量中,它们都将进入另一个向量。那么从用户那里获得这种输入的最佳方式是什么?最初没有给出条款数量的事实是最让我困惑的部分。我会尝试一段时间()...但我不知道如何终止它。我想我有点不确定 cin 在这种情况下如何工作。
感谢您的帮助。
有两个不同的问题:(a) 读取未知数量的输入行和 (b) 将给定的输入行解析为未知数量的 int
s。
首先,从输入中读取行。那只是 std::getline
:
std::string str
while (std::getline(std::cin, str)) {
// ???
}
然后,给定str
,我们必须将其解析为int
。最简单的方法是将其放入 stream:
std::istringstream iss(str);
然后要么一一阅读 int
s:
int i;
while (iss >> i) {
// do something
}
或者通过传递一对 istream_iterator<int>
:
将它们全部放入 vector
std::vector<int> v{std::istream_iterator<int>{iss},
std::istream_iterator<int>{}};
因此,记录每行输入总和的完整示例为:
std::string str
while (std::getline(std::cin, str)) {
std::istringstream iss(str);
std::vector<int> v{std::istream_iterator<int>{iss},
std::istream_iterator<int>{}};
if (!v.empty()) {
std::cout << "sum=" << std::accumulate(v.begin(), v.end(), 0) << '\n';
}
}
这在家庭作业和竞赛题中很常见,答案如下所示:
#include <sstream> //you may not have known about this
int num_cases = 0;
std::cin >> num_cases;
for(int case_num=0; case_num<num_cases; ++case_num) { //for each case
std::vector<std::vector<int>> variables;
int num_variables = 0;
std::cin >> num_variables;
std::cin.ignore(1); //ignore the newline character, it messes with getline
for(int var=0; var<num_variables; ++var) { //for each variable
std::string linestr;
std::getline(std::cin, linestr, '\n'); //read whole line into string
std::istringstream linestream(linestr); //make a stream from the line
int newclause = 0;
std::vector<int> lineclauses;
while(linestream >> newclause) //for each clause
lineclauses.push_back(newclause); //add it to the row
//when that fails, we read the whole line
variables.push_back(lineclauses); //so add the row to 'variables'
}
//Do stuff with variables vector.
}
我确定这是一个简单的问题。老实说,这应该是编写 SAT 求解器最简单的部分,但是,我应该让用户输入这样的数据:
Sample Input:
1 <-- 1st number denotes the number of cases I will have
5 <-- 2nd number represents the number of variables, followed
1 2 3 who knows how many clauses.
-1 3 4
-2 -3 5
-5 -1 2
-4 1 -2
-4 -1 -2 -3 -5
*blank line separates the different cases*
.... followed by as many cases as the user said they had
所以,我将这些子句存储到字符串向量中,它们都将进入另一个向量。那么从用户那里获得这种输入的最佳方式是什么?最初没有给出条款数量的事实是最让我困惑的部分。我会尝试一段时间()...但我不知道如何终止它。我想我有点不确定 cin 在这种情况下如何工作。
感谢您的帮助。
有两个不同的问题:(a) 读取未知数量的输入行和 (b) 将给定的输入行解析为未知数量的 int
s。
首先,从输入中读取行。那只是 std::getline
:
std::string str
while (std::getline(std::cin, str)) {
// ???
}
然后,给定str
,我们必须将其解析为int
。最简单的方法是将其放入 stream:
std::istringstream iss(str);
然后要么一一阅读 int
s:
int i;
while (iss >> i) {
// do something
}
或者通过传递一对 istream_iterator<int>
:
vector
std::vector<int> v{std::istream_iterator<int>{iss},
std::istream_iterator<int>{}};
因此,记录每行输入总和的完整示例为:
std::string str
while (std::getline(std::cin, str)) {
std::istringstream iss(str);
std::vector<int> v{std::istream_iterator<int>{iss},
std::istream_iterator<int>{}};
if (!v.empty()) {
std::cout << "sum=" << std::accumulate(v.begin(), v.end(), 0) << '\n';
}
}
这在家庭作业和竞赛题中很常见,答案如下所示:
#include <sstream> //you may not have known about this
int num_cases = 0;
std::cin >> num_cases;
for(int case_num=0; case_num<num_cases; ++case_num) { //for each case
std::vector<std::vector<int>> variables;
int num_variables = 0;
std::cin >> num_variables;
std::cin.ignore(1); //ignore the newline character, it messes with getline
for(int var=0; var<num_variables; ++var) { //for each variable
std::string linestr;
std::getline(std::cin, linestr, '\n'); //read whole line into string
std::istringstream linestream(linestr); //make a stream from the line
int newclause = 0;
std::vector<int> lineclauses;
while(linestream >> newclause) //for each clause
lineclauses.push_back(newclause); //add it to the row
//when that fails, we read the whole line
variables.push_back(lineclauses); //so add the row to 'variables'
}
//Do stuff with variables vector.
}