Заявление C ++ может быть упрощено

Извиняюсь за хромой вопрос. Я использую лицензионную версию 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);
}

Однако, учитывая итерацию, я не могу придумать упрощенное утверждение в первом. Буду признателен за любую оказанную помощь. Спасибо.

1

Решение

исправлять

Ваш return false должен быть вынесен за пределы for петля.


Потому что вы случайно положили его внутрь for цикл, эта итерация никогда не выполняется во второй раз.

Так что ваша IDE думает, что for Цикл бессмысленный, и предлагает упростить его до:

return data[0] == item;

Это явно не то, что вы хотите. Так что на самом деле это всего лишь сдвиг в одну строку, чтобы сделать это правильно.

6

Другие решения

Почему бы не использовать STL?

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

std::find возвращает итератор, указывающий на элемент, если он найден, или итератор, равный элементу «один за последним» (т. е. точно второй переданный аргумент), если ничего не найдено. Вы можете использовать простую проверку на равенство, чтобы решить, найдена ли она.

3

Вы фактически возвращаетесь после одной итерации в вашем цикле. Это замечание вашего компилятора.
Ваш код может быть упрощен простым написанием этого:

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 и у вас все будет хорошо (все же есть лучшие способы реализовать это, но это уже другая тема).

1
По вопросам рекламы [email protected]