可以简化C ++语句

时间:2017-12-28 15:42:21

标签: c++ if-statement intellij-idea simplify

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

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);
}

然而,现在涉及迭代,我无法在前者中提出简化的陈述。任何帮助深表感谢。谢谢。

3 个答案:

答案 0 :(得分:6)

<强>修正

您的return false应该移出for圈。

因为你不小心将它放在for循环中,所以这个迭代永远不会再次执行。

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

return data[0] == item;

这显然不是你想要的。所以,这只是为了使其正确的一线转变。

答案 1 :(得分:3)

为什么不使用STL?

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

std::find返回一个指向该元素的迭代器(如果找到它),或者迭代器等于一个过去的最后一个项(即完全是第二个参数传递),如果没有找到。您可以使用简单的相等性检查来确定是否找到了一个。

答案 2 :(得分:1)

在循环中进行一次迭代后,您实际上正在返回。这是你的编译器的评论。 您可以通过以下方式简化您的代码:

bool UnsortedList::isInTheList(float item) {

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

注意,这仍然是未定义的行为(UB)。您的所有执行路径中都没有return。 如果列表为空,则永远不会进入循环,这会导致UB,因为没有return语句,但函数必须返回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,你会没事的(仍然有更好的方法来实现这一点,但这是另一个话题。)