for循环中的布尔值不变

时间:2015-01-28 04:07:31

标签: c++

我有一个for循环,可以在向量中搜索对象" Book"。如果 refBook 在向量中,则应该返回true。如果没有,那么就是假的。

int has = 0;

for (int i = 0; i < mBooks.size()-1; i++) {
    if (mBooks.at(i) == refBook) {
        has = 1;
        cout << "Has book " << has << endl;
    };
};

return has;

它正确地通过循环并且如果Book在向量中将打印cout语句。但是,它仍然返回0.如果 has = 1; ,那么它将返回1.如果Book在向量中,它永远不会改变它的值。

为什么会这样?

3 个答案:

答案 0 :(得分:3)

首先,在&#39;如果&#39;关闭括号后,您不需要关闭分号。阻止或者为&#39;块。接下来,我怀疑问题可能是:

(int i = 0; i < mBooks.size()-1; i++)

看到减1?这意味着您不会检查向量中的最后一项。如果这本书是向量中的最后一项,那么你就不会捡到它! This图表给出了我认为你遇到的问题的一个很好的总结。

请改为尝试:

int has = 0;

for (int i = 0; i < mBooks.size(); i++)
{
    if (mBooks.at(i) == refBook)
    {
        has = 1;
        cout << "Has book " << has << endl;
    }
}

return has;

以下是一些针对您的提示。 C ++有一个内置的布尔类型bool,您可以使用它来代替整数来表示“真正的”#39;并且&#39; false&#39; (这是关键字!)。矢量也可以像原生数组一样被编入索引,因此您可以使用[]而不是&#39;在&#39;。所以,这里是您的代码的C ++版本:

bool has = false;

for (int i = 0; i < mBooks.size(); i++)
{
    if (mBooks[i] == refBook)
    {
        has = true;
        cout << "Has book " << has << endl;
    }
}

return has;

最后一个建议是使用新的C ++ 11&#39;范围,这是一个更先进的建议。语法,可用于向量和列表等。我也将介绍&#39; auto&#39;并且&#39;打破&#39;关键字,我建议您熟悉一下:

bool has = false;

for (auto& book : mBooks)
{
    if (book == refBook)
    {
        has = true;
        cout << "Has book " << has << endl;
        break;
    }
}

return has;

最后,看看std :: find函数(编辑:我看到其他人提出了这个)是值得的,这是为这种情况提供的。

答案 1 :(得分:3)

我只是抛弃这正是std::find存在的原因:

bool has = (std::find(mBooks.begin(), mBooks.end(), refBook) != mBooks.end());

在编写循环时很容易出错(例如停止一次迭代) - 这就是为什么有时候尝试避免首先编写它们会很好。

答案 2 :(得分:1)

这不是您正在寻找的代码(波浪以类似Jedi的方式传递)。

内存损坏不足,现在,如果打印语句, 返回1

所以你的问题可能在其他地方。

我会给一点一点建议:如果你只是想看看那本书是否在那里,那么没有需要继续寻找你的找到了。在您跳过最后一项时,您应该检查整个向量。你最好用以下的东西:

int hasBook (TBook &refBook) {
    for (int i = 0; i < mBooks.size(); i++) {
        if (mBooks.at(i) == refBook) {
            cout << "Has book " << refBook << endl;
            return 1;
        }
    }
    return 0;
}