• Как написать конструктор шаблонного класса АВЛ-дерево?

    @vanyamba-electronics
    #include <iostream>
    
    using namespace std;
    
    typedef enum {
        NotEqual,
        Less,
        Equal,
        Greater
    } CompareResult;
    
    template <typename _T>
    struct CF {
        typedef CompareResult (*CompareFunc)(const _T&, const _T&);
    };
    
    template <typename _T>
    class avl_tree
    {
    protected:
        typename CF<_T>::CompareFunc m_cf;
    public:
        avl_tree(typename CF<_T>::CompareFunc func) : m_cf(func), m_tree(nullptr) {}
    };
    
    CompareResult compare_int(const int& item1, const int& item2)
    {
        if (item1 < item2)
            return Less;
        if (item1 > item2)
            return Greater;
        return Equal;
    }
    
    int main()
    {
        avl_tree<int> int_tree(compare_int);
        return 0;
    }

    Я также попробовал реализовать это дерево, но в нём нет строгой логики. Всё прекрасно, когда элементов 3. Но когда встаёт задача вставить четвёртый, то возникает вопрос, какую форму должна принять эта структура. А правило говорит, что ветви, исходящие от верхнего элемента должны различаться по высоте не более, чем на единицу.
    Ну, допустим, что у нас 4 элемента. Можно изъять из дерева 1 элемент, из трёх выбрать верхний и как-то вставить четвёртый. Теоретически должно работать, но на практике такое решение может привести к тому, что будут варианты бесконечного изъятия лишних элементов, чтобы вставить их куда-то.
    Нужно строгое правило, чтобы этого не происходило.
    Ответ написан
    Комментировать
  • Почему при вызове конструктора выдает segmentation fault?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Square_matrix::Square_matrix(unsigned int size)
    {
        if (size < 1)
            std::cerr << "Invalid matrix size" << '\n';
        else if (size == 1)
        {
            this->size = 1;
            Square_matrix();
        }

    если передается size == 1, я вызываю конструктор по умолчанию

    Square_matrix(); -- это не вызов конструктора по умолчанию для текущего объекта.
    Ответ написан
    4 комментария
  • Что должен вернуть метод класса матрицы?

    1. В вашем коде нет деструктора, который бы освобождал память => у вас потенциальная утечка памяти.
    2. В случае оператора сложения, если матрицы имеют разный размер выбрасывайте исключение через std::runtime_error
    3. У вас отсутсвует конструктор копирования и при копировании объекта будет копироваться указатель на выделенную память.
    Ответ написан
    3 комментария
  • Почему пишет ошибку при попытке использовать шаблонную функцию?

    zagayevskiy
    @zagayevskiy
    Android developer at Yandex
    В объявлении int(*)(int), а в реализации int(*func)(). Несовпадение.
    Ответ написан
    2 комментария
  • Почему неправильно вводятся данные в программе?

    @Dalp
    Для ввода информации в Competition::initCat() Вы используете getline(), который принимает весь буфер ввода.
    Когда Вы вводите choice, Вы набираете "1" и перевод строки. В то время как "1" переходит из буфера в переменную choice, в буфере остаётся '\n' (символ перевода строки). Именно этот символ принимает функция getline(cin, breed).
    Для решения проблемы можно почистить строку после ввода choice используя cin.ignore().
    В данном случае можно использовать cin.ignore(1000, '\n'). Эта функция будет удалять символы из буфера до тех пор пока не встретит символ перевода строки, или пока не удалит 1000 символов. Однако этот способ не сработает если пользователь введёт число + 1000 пробелов + '\n', так как в таком случае символ перевода не удалится.
    Во избежание данной проблемы вместо cin.ignore(1000, '\n'), лучше использовать cin.ignore(numeric_limits::max(), '\n'). Этот вариант точно очистит всю строку вместе с '\n', но для его использования нужно подключить библиотеку:
    #include <limits>
    Ответ написан
    Комментировать
  • Почему после очистки строки программа падает?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Вы очищаете msg_buf в цикле же. На второй итерации у вас msg_buf уже очищен и вы его передаете в realloc и все падает.

    Попробуйте после free присвоить msg_buf = NULL.
    Ответ написан
    Комментировать
  • Как правильно отсортировать структуру по полю динамической строки с помощью qsort?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    qsort(variables, amount_of_variables - 1, sizeof(memoryCell), struct_cmp_by_name);

    Ну, всё правильно написано, если ты действительно хочешь отсортировать массив без последнего элемента.
    Ответ написан
    2 комментария
  • Парсинг строки не через strtok на СИ. В чем заключается ошибка?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    sizeof(char)

    Всегда равен 1 согласно стандарту, сэкономь нам и себе время.

    while(isdigit(string[j]) || isalpha(string[j]))
                {
                    buf = (char *)realloc(buf, ++k * sizeof(char));
                    buf[k - 1] = string[j];
                    j++;
                }

    После этого цикла buf не закрыт 0-терминатором, работать с ним как со строкой нельзя.

    parsed_string[size - 1] = (char *)malloc(strlen(buf) * sizeof(char));
    strcpy(parsed_string[size - 1], buf);

    Переполнение буфера, потому что strcpy копирует strlen(buf) символов строки + 1 нулевой байт.
    Ответ написан
    1 комментарий