我正在阅读C ++ Primer并正在进行练习。它希望我获取用户的输入并按空格' '
分隔。所以我提出了2个解决方案。
第一个解决方案:
vector<string> vector1;
string input;
string temp = ""; // temperary hold each word value in input.
string x1 = "";
char x2 = 'b';
x1 += x2;
cout << x1 << endl;
getline(cin, input);
input += " ";
for (string::size_type index = 0; index != input.size(); index++)
{
if (!isspace(input[index]))
{
temp += input[index];
}
else
{
if (temp.size() > 0)
{
vector1.push_back(temp);
temp = "";
}
}
}
第二个解决方案
vector<string> vector1;
string input;
string temp = ""; // temperary hold each word value in input.
string x1 = "";
char x2 = 'b';
x1 += x2;
cout << x1 << endl;
getline(cin, input);
//input += " ";
for (string::size_type index = 0; index != input.size(); index++)
{
if (!isspace(input[index]))
{
temp += input[index];
}
else
{
if (temp.size() > 0)
{
vector1.push_back(temp);
temp = "";
}
}
}
if (!temp.empty())
{
vector1.push_back(temp);
}
它们之间的区别是第一个解决方案是为用户输入添加空间,而第二个解决方案检查我不添加最后一个字。我想知道哪一个更好地解决了这个问题?
如果有更好的解决方案,请告诉我。
答案 0 :(得分:4)
我会这样写:
std::vector<std::string> data;
std::copy(std::istream_iterator< std::string>(std::cin),
std::istream_iterator< std::string>(),
std::back_inserter(data));
它与@ K-ballo的答案几乎相同,只是我让std::copy
直接从输入流(即std::cin
)而不是std::stringstream
读取。
演示:http://www.ideone.com/f0Gtc
-
或者你可以使用vector的构造函数,完全避免使用std::copy
:
std::vector<std::string> data(std::istream_iterator<std::string>(std::cin),
std::istream_iterator<std::string>());
你已经完成了!演示:http://www.ideone.com/Szfes
如果您觉得难以阅读,请改用:
std::istream_iterator<std::string> begin(std::cin), end;
std::vector<std::string> data(begin, end);
答案 1 :(得分:1)
在C ++中,读取空格分隔的值非常简单,并且内置于该语言中。我可能错了,但看起来你的事情过于复杂。
std::string line;
if (std::getline(std::cin, line)) {
std::stringstream ss(line);
std::vector<std::string> inputs_on_this_line(
std::istream_iterator<std::string>(ss)
, std::istream_iterator<std::string>() );
//do stuff with the strings on this line.
}
答案 2 :(得分:0)
您可以轻松地将流中的输入拆分为字符串分隔值,并将它们插入到带有以下内容的向量中:
string input;
... get the input, perhaps with getline(cin, input); ...
stringstream input_stream( input );
vector<string> vector1;
std::copy(
(std::istream_iterator< std::string >( input_stream )), std::istream_iterator< std::string >()
, std::back_inserter( vector1 )
);
std::istream_iterator< std::string >
对将通过一次提取input_stream
来迭代std::string
(读取字符串直到找到空格字符)。 std::back_inserter
会为push_back
中的每个字符串调用vector
。