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 如果找到元素则指向该元素的迭代器,如果未找到则指向最后一项的迭代器(即正好传递的第二个参数)。您可以使用简单的相等性检查来确定是否找到了。
抱歉这个蹩脚的问题。我正在为我的 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 如果找到元素则指向该元素的迭代器,如果未找到则指向最后一项的迭代器(即正好传递的第二个参数)。您可以使用简单的相等性检查来确定是否找到了。