获取输入行并将该行中的单词添加到 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::copystd::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&lt;std::string&gt;(is), std::istream_iterator&lt;std::string&gt;())【参考方案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 我说这是最好的方法之一,因为:它不需要任何其他库,除了vectorsstream 用于存储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++

在 C++ 中将某种结构化的文本文件读入数组

C++ 恢复/传递一个向量(在标题中调用啥?)

如何在 C++ 中读取文件并将文件中的数据插入到类类型的向量中?

CodeEval 挑战:输入文件中的反转字符串