Функция вставки универсального набора int

У меня небольшая проблема со следующей задачей. Функция вставки также должна работать для типа int, но, к сожалению, она не работает. В чем может быть проблема?

Пример вызова функции вставки:

Set<int, 4> s0;

s0.insert(2);

Это массив из четырех элементов, и первый элемент равен 2.

template <class T, size_t n = 10>
class Set{
private:
    T adat[n];
public:
    size_t size (){return n;}
    bool isElement (T num){
        for (size_t i = 0; i < n; i++)
        {
            if (adat[i] == num)
                return true;
        }
        return false;
    }
    void insert (T data){
        if (!isElement(data)){
            size_t i = 0;
            while((adat[i] != 0)||(i != n))
                i++;
            if (i != n)
            {
                adat[i] = data;
            }
            else
                throw("The array is full!");
        }
    }
};

У вас нет размера для подсчета вставленного элемента (тогда как n - это емкость)?

Jarod42 23.04.2022 00:07

Подумайте о том, что делает while((adat[i] != 0)||(i != n)) - (i != n) всегда будет истинным, если только i == n, и ANYTHING||true == true - так что цикл while всегда будет выполняться до i == n (в данном случае 10). Оператор if после цикла while затем проверяет, если i != n (что не может быть правдой, потому что цикл while зацикливается до i == n), поэтому вы всегда будете нажимать throw()

Turtlefight 23.04.2022 00:36
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
2
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это может быть какая-то неуловимая ошибка за пределами границ. Прохладно.

В этом цикле

while((adat[i] != 0)||(i != n))
   i++;

вы выйдете за пределы, потому что последний элемент "(n-1)", а не "n". И вы всегда будете выходить за рамки из-за «или» в условии. Цикл всегда будет выполняться по крайней мере до "i==n" из-за правильной части "или". И тогда, после выхода за пределы, доступное значение «adat[i]» будет неопределенным и, скорее всего, не нулевым. Таким образом, вы гарантируете, что "i!=n" никогда не будет тронут.

Это также из-за булевой оценки быстрого доступа. если "(adat[i] != 0)" уже истинно, то следующий член в "или" не имеет значения и также не будет оцениваться.

И тогда бесконечный цикл будет работать вечно. . .

Вы также должны инициализировать свой массив "adat", чтобы быть уверенным, что он содержит значения по умолчанию.

Сделайте это с помощью: T adat[n]{};.

Наконец, чтобы исправить цикл while, напишите:

while ((adat[i] != 0) && (i < n)) {

Другие вопросы по теме