我有一个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在向量中,它永远不会改变它的值。
为什么会这样?
答案 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;
}