获取输入行并将该行中的单词添加到 C++ 中的向量的最佳方法是啥?
Posted
技术标签:
【中文标题】获取输入行并将该行中的单词添加到 C++ 中的向量的最佳方法是啥?【英文标题】:What is the best way to take an input line and add the words in the line to a vector in C++?获取输入行并将该行中的单词添加到 C++ 中的向量的最佳方法是什么? 【发布时间】:2020-08-18 14:17:46 【问题描述】:基本上我想输入一个包含多个单词(长度未指定)的输入行,逐个单词并将每个单词添加到一个向量中。 我可以使用 getline 并编写一个函数来拆分它,但想要一种更简洁的方式来读取每个单词并继续将其添加到向量中,直到按下 Enter 键。像这样直到按下回车键。谢谢!
vector<string> inp;
while(????)
string str;
cin>>str;
inp.push_back(str);
我正在寻找不使用库的东西,只是在按下回车键时停止输入的某种方式,上面代码中的 while 循环中的某些条件使得当遇到回车键时,它会中断并停止输入.比如:
while(1)
string str;
cin>>str;
// if( character entered =='\0')
//break;
inp.push_back(str);
任何帮助将不胜感激。
【问题讨论】:
请显示使用 getline 的代码,并将字符串放入向量中。否则,据我们所知,您的解决方案可能会尽可能简洁。 专业提示:考虑用“我该怎么做”而不是“什么是最好的方法”来提出这样的问题。前者将产生客观的解决方案,而后者将引发意见和争论。计算机专家可能对“最佳”之类的词持迂腐态度。 查看***.com/questions/236129/… 了解许多不同的解决方案。 【参考方案1】:什么是最好的是无法回答的;这取决于你如何衡量好坏,这在很大程度上是一个品味和个人喜好的问题。 例如,有些人喜欢编写显式循环,而另一些人则尽可能避免使用它们。
不使用显式循环的一种方法是使用std::copy
和std::istringstream
。
std::vector<std::string> words;
std::string line;
if (std::getline(std::cin, line))
std::istringstream is(line);
std::copy(std::istream_iterator<std::string>(is),
std::istream_iterator<std::string>(),
std::back_inserter(words));
【讨论】:
std::copy
的替代品是words.insert(words.end(), std::istream_iterator<std::string>(is), std::istream_iterator<std::string>())
【参考方案2】:
借助std::istringstream
(来自sstream
库),将字符串的每个单词拆分并将它们存储到一个向量中的一个好方法:
#include <iostream>
#include <vector>
#include <sstream>
int main(void)
std::string input;
std::string temp;
std::vector<std::string> words;
std::getline(std::cin, input);
// Using input string stream here
std::istringstream iss(input);
// Pushing each word sep. by space into the vector
while (iss >> temp)
words.push_back(temp);
for(const auto& i : words)
std::cout << i << std::endl;
return 0;
作为一个示例测试用例,您可以看到:
$ g++ -o main main.cpp && ./main
Hello world, how are you?
Hello
world,
how
are
you?
【讨论】:
讨厌:“最好的之一”没有任何意义。 (它在前 3 名吗?前 10 名?前 100000 名?你如何衡量最佳?) @Wyck 我说这是最好的方法之一,因为:它不需要任何其他库,除了vector
和sstream
用于存储istringstream
。我在这里使用了istringstream
,而不是stringstream
,后者的性能比这更快,这使它更好。
看到了吗?你应该说that,而不是说它是最好的之一。它提供的信息要多得多。就像我说的,这只是一个小问题。不要把它太难 - 但也许在你未来的写作中考虑它。 :)
感谢这确实有帮助!我实际上是在不使用库的情况下寻找一些东西,只是在按下回车键时停止输入的某种方式。我将编辑我的问题并添加它。
@adikj 这就是创建库的原因。这是为了让生活更简单,你只是想让生活变得更复杂。【参考方案3】:
以下代码与@Rohan Bari 的答案几乎相同,但我发布是因为拆分字符串有所不同。
#include <iostream>
#include <iterator>
#include <sstream>
#include <vector>
#include <string>
int main(void)
std::string input;
std::getline(std::cin, input);
std::stringstream ss(input);
auto words = std::vector<std::string>(std::istream_iterator<std::string>(ss), ); // difference
for (const std::string& s : words)
std::cout << s << std::endl;
return 0;
【讨论】:
以上是关于获取输入行并将该行中的单词添加到 C++ 中的向量的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
使用fstream将文件逐行读取到C++中的二维向量中[重复]
使用向量和 fstream 的代码中的 Segfault 11? C++