(C++) 学习向量 - coding/input 流 termination/comparing 向量的问题

(C++) Learning vectors - problems with coding/input stream termination/comparing vectors

我是从 Bjarne Stroustrup 的书中学习我的第一门编程语言 C++ 的初学者 "Programming Principles and Practice Using C++"。第 4 章讨论向量。之前解释的一切我都会很容易理解并且代码总是可以正常工作,直到现在。

我写的代码根本不起作用。以下代码是为小练习而制作的,其中输入内容被读入并打印出单词,将不喜欢的单词删除。

#include "std_lib_facilities.h"

int main() {
    vector<string>text;
    string disliked = "cat";

    for (string word; cin >> word;) {       
        text.push_back(word);
    }

    for (int a = 0; a < text.size(); ++a) {
            if (text[a] != disliked) {
                cout << text[a] << endl;
            }
            else {
                cout << "BLEEP\n";
            }
        }
    keep_window_open();
}

我的第一个想法是创建另一个向量 vector<string>disliked ={"cat", ...} ,用于不喜欢的词,但是 if (text[x] != disliked) 似乎不是比较每个向量中元素的方法(至少它是警告我关于运算符和操作数不匹配的问题)。有办法吗?

但是回到代码:经过一些修改并且输入中没有任何不喜欢的词,程序有时会 运行。我仍然无法满足主要目的。也许,真正的错误是在输入端。 Ctrl+Z 对我不起作用,只是输入一个字符。不知何故 Ctrl+C 恰好可以正常工作(如果没有不喜欢的词)。

那么真正的问题来了:

  1. 代码是否正确? (因为我无法自己检查,而我可能一直在不正确地终止输入)

  2. 考虑到 Ctrl+Z 只会向输入添加一个字符,我如何才能以任何其他方式终止输入?

  3. 有没有办法通过比较 "input" 向量和 "disliked" 向量来使这个程序运行?

我猜你有两个选择:

1.从文本文件中获取输入。

在这种情况下,您必须将数据放在项目目录中的文本文件中。例如,在下面发布的代码中,"text.txt" 是应该存储输入(你的话)的地方。

小说明: 我不确定 "std_lib_facilities.h" 包含什么,所以我添加了一些标准头文件来为我编译代码。

#include <iostream>
#include <fstream>
#include <vector>
#include <string>

int main()
{
    std::vector<std::string> texts;
    std::string dislikedWord = "cat";

    std::ifstream fin("text.txt");

    for (std::string word; fin >> word;)
        texts.push_back(word);

    unsigned textsCount = texts.size();
    for (unsigned textIndex = 0; textIndex < textsCount; ++textIndex)
        if (texts[textIndex] != dislikedWord)
            std::cout << texts[textIndex] << '\n';
        else
            std::cout << "BLEEP\n";

    return 0;
}

2。继续读单词,直到最终满足条件。

在这种情况下(如果您不想从文本文件中读取)您应该插入一个条件使程序停止接受输入,这样您就可以继续进行下去。条件可以是可以读取的最大字数或一些 'special' 字。在下面的示例中,我选择在十个字处结束阅读。

小注:也许你做练习的那一章告诉你要插入什么条件。我怀疑您是否必须使用 CTRL+C 或任何其他组合键来解决该练习。

#include <iostream>
#include <vector>
#include <string>

int main()
{
    const unsigned totalWords = 10;
    std::vector<std::string> texts;
    std::string dislikedWord = "cat";

    for (std::string word; std::cin >> word;) {
        texts.push_back(word);
        if (texts.size() == totalWords) // could've put it in the for condition
            break; // terminates the for-loop
    }

    unsigned textsCount = texts.size();
    for (unsigned textIndex = 0; textIndex < textsCount; ++textIndex)
        if (texts[textIndex] != dislikedWord)
            std::cout << texts[textIndex] << '\n';
        else
            std::cout << "BLEEP\n";

    return 0;
}

Is the code correct? (since I can't check it myself while I might have been terminating the input improperly entire time)

似乎对我有用。

How can I terminate input any other way, considering that Ctrl+Z only adds a character to the input?

我用Ctrl-D来标记行尾。

Is there a way of making this program work by comparing the "input" vector with the "disliked" vector?

通常当你比较类型时(==!=)它们具有相同的类型(或者编译器可以将一种类型转换为与另一种类型相同的类型(但那是为了这里比较迂腐,初学者最好考虑比较同类对象))。

vector<string> text;
string         disliked = "cat";

// STUFF
if (text[x] != disliked) // disliked is a string
                         // text[x]  is a string (because we are accessing the `x` element.

如果我们将 disliked 改为向量:

vector<string> text;
vector<string> disliked = "cat";

// STUFF
if (text[x] != disliked) // disliked is a vector<string>
                         // text[x]  is a string

由于类型不匹配,因此很难进行比较。所以需要遍历disliked中的所有元素,看能不能找到这个词。

bool found = false;
for(std::size_t loop = 0; loop < disliked.size(); ++loop) {
    if (text[x] == disliked[loop) {  // Types are the same here.
        found = true;
        break;
    }
}
if (!found) {

有一些技巧可以使上面的代码紧凑。如果你刚刚开始,这可能有点早,但为了完整起见,我会在这里添加它:

bool found = std::find(std::begin(disliked), std::end(disliked), text[x]) != std::end(disliked);
if (!found) {