为蹩脚的问题道歉。我正在使用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);
}
然而,现在涉及迭代,我无法在前者中提出简化的陈述。任何帮助深表感谢。谢谢。
答案 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
,你会没事的(仍然有更好的方法来实现这一点,但这是另一个话题。)