Bjarne Stroustrup Book - 矢量和For循环 - 赢了工作

时间:2017-05-20 22:27:21

标签: c++ loops vector

我在使用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();
}

我错过了什么?提前谢谢。

2 个答案:

答案 0 :(得分:11)

输入字符串,完成后按 Ctrl + Z (后跟 Enter ),如果在Windows或 Ctrl + D 。执行此操作时,cin>>temp;循环中的for条件将评估为false,程序将退出循环。

答案 1 :(得分:10)

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

其次,没有必要使用stdafx.h。这是由Microsoft IDE生成的,它提供了一种加速大型项目编译的方法,因为它使编译器如何使用预编译的头文件。如果您只希望使用Microsoft编译器,那么请随意填充您的靴子并使用此编译器。但是,它不是标准的C ++,可能(取决于IDE和项目设置)包含不适用于非Microsoft编译器的特定于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将继续等待输入。 USER通常需要触发和结束文件条件。在Windows下,这需要用户在空行上输入CTRL-Z,然后输入回车键。

另一种方法是让一些预先商定的文本导致循环退出,例如

 #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