(C ++)学习向量 - 编码/输入流终止/比较向量的问题

时间:2017-04-09 15:15:28

标签: c++ vector terminate

我是第一次学习我的第一门编程语言--C ++ - 来自Bjarne Stroustrup的书"编程原理和练习使用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. 有没有办法通过比较&#34;输入&#34;来使这个程序工作?矢量与&#34;不喜欢&#34;矢量?

2 个答案:

答案 0 :(得分:0)

我猜你有两个选择:

<强> 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。继续阅读单词,直到最终满足条件。

在这种情况下(如果您不想从文本文件中读取),您应该插入一个使程序停止输入的条件,这样您就可以更进一步。条件可以是可以读取的最大字数或某些“特殊”字。在下面的例子中,我选择以10个单词结束阅读。

次要评论:也许您参加练习的章节会告诉您要插入的条件。我怀疑你必须使用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;
}

答案 1 :(得分:0)

  

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

似乎适合我。

  

考虑到Ctrl + Z只为输入添加了一个字符,我怎么能以其他方式终止输入?

我使用Ctrl-D标记行尾。

  

有没有办法通过比较“输入”向量和“不喜欢”向量来使这个程序工作?

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

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.

如果我们改变不喜欢矢量:

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

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

由于类型不匹配,因此难以比较。所以你需要遍历所有不喜欢的元素,看看你是否能找到这个词。

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) {