Извиняюсь за хромой вопрос. Я использую лицензионную версию 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;
}
}
Тем не менее, идея показывает цветной знак на 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;
Это явно не то, что вы хотите. Так что на самом деле это всего лишь сдвиг в одну строку, чтобы сделать это правильно.
Почему бы не использовать STL?
inline bool UnsortedList::isInTheList(float item) {
return std::find(data, data+length, item) != data+length;
}
std::find
возвращает итератор, указывающий на элемент, если он найден, или итератор, равный элементу «один за последним» (т. е. точно второй переданный аргумент), если ничего не найдено. Вы можете использовать простую проверку на равенство, чтобы решить, найдена ли она.
Вы фактически возвращаетесь после одной итерации в вашем цикле. Это замечание вашего компилятора.
Ваш код может быть упрощен простым написанием этого:
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
и у вас все будет хорошо (все же есть лучшие способы реализовать это, но это уже другая тема).