loop - c++ vector遍历




Bjarne Stroustrup书籍-矢量和For循环-将无法正常工作 (2)

输入字符串,完成后按Ctrl + Z (后跟Enter ),如果在Windows上,则按下Ctrl + D。 当你这样做的时候cin>>temp; 您的for循环内的条件将评估为false,您的程序将退出循环。

我正在从“使用C ++编程原理和实践”中学到的一段特定代码遇到困难。

我不能从一个循环引用一个向量的输出。 我正在使用std_lib_facilities和stdafx,因为这本书和MVS告诉了我。

#include "stdafx.h"
#include "../../std_lib_facilities.h"


int main()
{
    vector<string>words;
    for(string temp; cin>>temp; )
        words.push_back(temp);
    cout << "Number of words: " << words.size() << '\n';
}

这不会产生任何东西。 我会得到提示,键入一些单词,然后输入,然后没有。

尝试了一些变化,我在这里和其他网站,以及,如:

//here i tried the libraries the guy used in his code
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    cout << "Please enter a series of words followed by End-of-File: ";
    vector<string> words;
    string word;
    string disliked = "Broccoli";

    while (cin >> word)
        words.push_back(word);

    cout << "\nNumber of words: " << words.size() << endl;

      // cycle through all strings in vector
    for (int i = 0; i < words.size(); ++i)
    {
      if (words[i] != disliked)
          cout << words[i] << endl;
      else
          cout << "BLEEP!\n";
    }
    return 0;
}

依然没有。

尝试了一些东西后,通过消除我很确定问题是与循环到矢量通信,因为所有这些工作正常:

int main()
{
    vector<string>words = { "hi" };
    words.push_back("hello");
    cout << words[1] << "\n"; // this will print hello

    for (int i = 0; i < words.size();++i) {
         cout << words[i] << "\n"; // this will print out all elements 
                                   // inside vector words, ( hi, hello)
         }

    cout << words.size();// this will print out number 2

    for (string temp; cin >> temp;) {
         words.push_back(temp);
        }

    cout << words.size();// this won't do anything after i type in some 
                         // words; shouldn't it increase the size of the 
                         // vector?
}

这也不是:

int main()
{
    vector<string>words = { "hi" };
    for (string temp; cin >> temp;) {
        words.push_back(temp);
        }
    cout << words.size();
}

我错过了什么? 先谢谢你。


首先,没有必要使用std_lib_facilities.h 。 本书中使用的仅仅是为了避免本书中的每个示例都包含一组标准头文件,或者纠正编译器之间的非标准行为。 这也是一个using namespace std标题的头文件 - 你会发现许多例子(在SO和更广泛的互联网上)解释了为什么在头文件中using namespace std是非常糟糕的做法。

其次,也没有必要使用stdafx.h 。 这是由Microsoft IDE生成的,并且提供了一种在大型项目中加速编译的手段,因为它是如何导致编译器使用预编译头文件的。 如果你只希望使用微软的编译器,那么随时来填补你的靴子,并使用这一个。 然而,这不是标准的C ++,可能(取决于IDE和项目设置)包含Windows特定的头文件,这些头文件不会与非Microsoft编译器一起工作,而且在论坛中可能会阻止使用其他编译器的人帮助您 - 因为他们将很好的理由假设你的代码使用微软特定的扩展,这将意味着他们可能无法帮助你。

代码的第一个样本可以用标准的C ++(不使用上面的头)作为重写

 #include <vector>    // for std::vector
 #include <string>    // for std::string
 #include <iostream>   // std::cout and other I/O facilities

 int main()
 {
      std::vector<std::string> words;
      for(std::string temp; std::cin >> temp; )
           words.push_back(temp);
      std::cout << "Number of words: " << words.size() << '\n';
 }

在你兴奋之前,这将表现出同样的问题(不是显然完成)。 原因实际上是循环的终止条件 - std::cin >> temp只会在流中遇到文件结尾或其他错误时终止循环。

所以,如果你输入

  The cow jumped over the moon

std::cin将继续等待输入。 用户通常需要触发和结束文件条件。 在windows下,这需要用户在空行上输入CTRL-Z ,然后按Enter键。

另一种办法是有一些事先约定的文本,导致循环退出,如

 #include <vector>    // for std::vector
 #include <string>    // for std::string
 #include <iostream>   // std::cout and other I/O facilities

 int main()
 {
      std::vector<std::string> words;
      for(std::string temp; std::cin >> temp && temp != "zzz"; )
           words.push_back(temp);
      std::cout << "Number of words: " << words.size() << '\n';
 }

当输入包含单词zzz时,将导致程序退出。 例如

 The cow jumped over the moon  zzz

还有其他技术,例如一次读取一个字符,当用户输入两个连续的换行符时停止。 这需要你的代码来解释每个字符,并决定什么是一个字。 我会把这个作为一个练习。

请注意,标准C ++没有办法直接读取按键 - 上述问题与标准流如何工作以及与主机系统交互有关。

用户也可以通过将相同的文本放入实际的文件中来使用该程序,并且(当程序运行时)将程序的输入重定向到来自该文件。 例如your_executable < filename





vector