Skip to content

Conversation

@mmikhail2001
Copy link
Owner

@mmikhail2001 mmikhail2001 commented Nov 20, 2022

Домашняя работа 5

STL-совместимый контейнер

Некоторые замечания:

  • структура Node хранит
    • указатели для работы с АВЛ-деревом (left, right, parent)
    • указатели для работы со списком (next, prev)
  • класс Iterator - дружественный для структуры Node, не имеет ссылки на контейнер
    • в конструкторе принимает указатель на корень дерева и указатель на текущий элемент
    • функции инкремента и декремента позволяют дойти до элементов, находящихся после последнего и перед первым соответственно, для этого предусмотрены флаги after_end и before_begin
    • при разыменовани итераторов, указывающих на элементы из предыдущего пункта, выбрасывается исключение
    • статические функции getLeftMost и getRightMost в классе Set нужны для итератора, чтобы, например, из элемента после последнего (node = nullptr, after_end = true, before_begin = false) декрементом дойти до последнего элемента

Copy link
Collaborator

@Denactive Denactive left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Отлично сделал все пункты, даже итерация за О(1) есть.
Какая-то беда с отступами. Нужно их поправить и убрать лишние комментарии. Если линтер это пропускает, наверное, с ним что-то не так.
Подпиши работу в ридми. Требовать работу с твоей библиотекой в меин не буду.
Расскажи свои соображения по поводу линковки через include в конце файла тут.
Ты правильно декомпозировал .h, хотя обычно в случае с шаблонными классами, этого не требуют. Я лишь укажу на то, что set_definition.h по сути является отдельным классом авл-дерева, который, например, ты бы мог использовать отдельно. Обычно, сет - обертка над чистым деревом, т.е. содержит stl container AVL-tree своим полем.

можешь написать тесты на замер асимптотики или хотя бы сравнительный тест на время работы

Добавь преподавателя, как исправишь разметку

# techopark_cpp_hw
Репозиторий для сдачи домашних работ по С++ в Технопарке

**STL-совместимый контейнер**
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Добавь само задание в ридми, подпиши работу

template <typename T, typename Comparator>
void TestInsertErase(Set<T, Comparator> &set, std::istream &in)
{
char op;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

что-то странное с отступами

#include "iterator.h"

template <typename T, typename Comparator>
void TestInsertErase(Set<T, Comparator> &set, std::istream &in)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

круто сделал с потоком

});
EXPECT_EQ(count, 2);

// CORRECT ERROR: no matching function for call to ‘Set<int>::insert(Set<int>::iterator&, const value_type&)’
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

фраза "правильная ошибка", возможно, вводит в заблуждение, но пусть будет. Здорово

using value_compare = Cmp;
using reference = T&;
using const_reference = const T&;
using iterator = Iterator<T, Cmp>;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

необязательно было реализовывать сигнатуру std::set полностью

@@ -0,0 +1,101 @@
#pragma once
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

те же замечания по подключению файлов что и в set. кажется, прагма ванс спасает, но и без нее должно работать

node = Set<T, Cmp>::getRightMost(root);
after_end = false;
}
// before_begin-- = before_begin
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

убери

Iterator<T, Cmp> Iterator<T, Cmp>::operator--(int)
{
Iterator<T, Cmp> tmp(*this);
operator--();
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

более наглядно будет вызвaть (*this)--

{
if (!node)
{
throw std::runtime_error("operator*() to nullptr");
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

кажется, для итераторов есть свои классы исключений для случаев окончания итерации, но это не точно

}

template <typename T, typename Cmp>
typename Set<T, Cmp>::Node* Set<T, Cmp>::prevInternal(Node* node) const
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

абсолютно правильная идея со списком

@Denactive
Copy link
Collaborator

обрати внимание на такой пункт в ДЗ:

Таким образом:
БЕЗ БАЗОВЫХ, КОД КОТОРЫХ МЕНЯТЬ ЗАПРЕЩЕНО - работа не допускается к проверке
С БАЗОВЫМИ, НО БЕЗ СВОИХ - штраф 50%
С БАЗОВЫМИ + СВОИМИ - баллы пропорционально покрытию

покрытие надо будет померить в твоих тестах

@mmikhail2001
Copy link
Owner Author

mmikhail2001 commented Dec 3, 2022

Исправлены следующие замечания:

  • поправлена разметка (через clang-format)
  • удалены лишние комментарии
  • подписана работа в README.md и добавлено задание
  • добавлены пустые строки в конце каждого файла
  • убраны ненужные include в set.h
  • изменено расширение на ".hpp" в файлах с реализацией
  • протестирована библиотека без базовых тестов и посчитано покрытие
    • GO MY TESTS COVERAGE в CI
  • протестирована библиотека с базовыми тестами и посчитано покрытие
    • GO ALL TESTS COVERAGE в CI
  • отчеты о покрытии с базовыми тестами и без базовых в артефактах

В моей реализации класс Set не является оберткой над AVL-деревом, и, действительно, смешивать логику дерева и контейнера - не лучшее решение. Нужно было разделить зоны ответственности.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants