C++语句可以简化

C++ Statement can be simplified

抱歉这个蹩脚的问题。我正在为我的 C++ 课程使用 Intellij Clion Student 许可版本。作为实现 UnsortedList class 的一部分,我们必须编写一个方法 isInTheList 来查看数组中是否存在元素。 class 实现为

bool UnsortedList::isInTheList(float item) {

    for (int i = 0; i < length; i++) {
        if (data[i] == item) {
            return true;
        }
        return false;
    }
}

但是,ide 在 data[i] == item 处显示了一个彩色标记,并弹出了一个提示

Statement can be simplified less... (Ctrl+F1) 
This inspection finds the part of the code that can be simplified, e.g. constant conditions, identical if branches, pointless boolean expressions, etc.

对于先前检查列表是否为空的方法,我使用了以下简化形式而不是 if-else 语句。

bool UnsortedList::isEmpty() {
    return (length == 0);
}

但是,现在涉及到迭代,我无法在前者中提出一个简化的说法。任何帮助深表感谢。谢谢。

修复

你的 return false 应该移出 for 循环。


因为你不小心把它放在了for循环中,这个迭代永远不会执行第二次。

因此您的 IDE 认为 for 循环毫无意义,建议您将其简化为:

return data[0] == item;

这显然不是您想要的。所以实际上这只是一个正确的一行转换。

你实际上是 return 在你的循环中进行一次迭代之后。那是你的编译器的评论。 您的代码可以通过简单地编写来简化:

bool UnsortedList::isInTheList(float item) {

    if (length != 0) {
        return data[0] == item;
    }
}

请注意,这仍然是未定义的行为 (UB)。您的所有执行路径中都没有 return 。 如果你的列表是空的,你永远不会进入循环,这会导致一个 UB,因为没有 return 语句,但是函数必须 return a bool.

我想,你的意图是,写这样的东西。

bool UnsortedList::isInTheList(float item) {

    for (int i = 0; i < length; i++) {
        if (data[i] == item) {
            return true;
        }
    }

    return false;
}

return false; 从你的 for loop 中移出,你会没事的(仍然有更好的方法来实现这个,但那是另一个话题)。

为什么不使用 STL?

inline bool UnsortedList::isInTheList(float item) {
    return std::find(data, data+length, item) != data+length;
}

std::find returns 如果找到元素则指向该元素的迭代器,如果未找到则指向最后一项的迭代器(即正好传递的第二个参数)。您可以使用简单的相等性检查来确定是否找到了。