Opened 4 years ago

Closed 4 years ago

#829 closed ожидается проверка (задача сдана)

WW #12

Reported by: Solovyev Gleb Owned by: Sokolov Viacheslav
Component: WW_vector Version: 3.0
Keywords: Cc:

Description


Change History (5)

comment:1 Changed 4 years ago by Sokolov Viacheslav

Type: ожидается проверкаожидаются исправления

Тесты не покрывают operator=(&&) и []const.

97 Vector<T> fourth_vec = std::move(vec);

это конструктор, а не operator =.

37 Product(Product &&other) noexcept { swap(other); }

Поля инициализируются мусором. Нужно сначала позвать делигирующий конструктор по-умолчанию.

8 BAD_ALLOC,

не понятно, чем это лучше, чем std::bad_alloc. Нехватка памяти - это не проблема при работе конкретно с вектором, а проблема системы целиком. Обрабатывать эту проблему удобнее одинаковым образом.

14 : capacity_{capacity}, size_{0}, array_{reinterpret_cast<T *>(aligned_alloc(

15 alignof(T), sizeof(T) * capacity_))} {

какая мотивация использовать aligned_alloc?
выравнивание кода выглядит ужасно

12 template <typename T>
13 Vector<T>::Vector_holder::Vector_holder(size_t capacity)
14 : capacity_{capacity}, size_{0}, array_{reinterpret_cast<T *>(aligned_alloc(
15 alignof(T), sizeof(T) * capacity_))} {
16 if (array_ == nullptr && capacity_ != 0) {
17 throw(Vector_exception{Vector_err_type::BAD_ALLOC});
18 }
19 }

кажется, нет смысла звать этот конструктор с capacity==0

62 new (array_ + size_) T{object};

здесь позовется T::T(T&) / T::T(const T&).
Нужен std::move.

https://stackoverflow.com/questions/10876930/should-one-never-use-static-inline-function

82 template <typename T> Vector<T>::Vector() : vector_holder_{DEFAULT_CAPACITY} {}

пустая строка..

Если DEFAULT_CAPACITY предполагается степенью двойки, стоит поставить на это static_assert

152 while (size() < n) {
153 vector_holder_.place_default();
154 }
здесь может произойти исключение и строгая гарантия будет нарушена. Нужно аккуратнее обработать это место.

165 vector_holder_.place_object(t);
std::move

comment:2 Changed 4 years ago by Solovyev Gleb

Type: ожидаются исправленияожидается проверка
Version: 1.02.0

comment:3 Changed 4 years ago by Sokolov Viacheslav

Type: ожидается проверкаожидаются исправления

reserve(capacity() << 2);

constexpr size_t DEFAULT_CAPACITY = 8;

В условии все же явно просят

методы и конструкторы, которые увеличивают capacity, делают его равным минимальной достаточной степени двойки.

116 inline constexpr bool check_is_power_of_2(size_t n) {
117 if (n == 0) {
118 return false;
119 }
120 while (n > 1) {
121 if (n & 1) {
122 return false;
123 }
124 n >>= 1;
125 }

constexpr implies inline

исправлять не нужно, но проще (и эффективнее) всего реалилуется так:
return 0==(n&(n-1))

89 while (number_of_defaults > 0) {
90 array_[source.size_ + number_of_defaults].~T();
91 }

здесь бесконечный цикл

16 Vector& operator=(const Vector& other) noexcept;
не noexcept

comment:4 Changed 4 years ago by Solovyev Gleb

Type: ожидаются исправленияожидается проверка
Version: 2.03.0

Все исправил. Константу на дефолтный размер убирать не стал, так как ее удобно гибко менять, но для соответствия условию она теперь равна 1.

comment:5 Changed 4 years ago by Sokolov Viacheslav

Resolution: задача сдана
Status: assignedclosed

90 array_[source.size_ + (number_of_defaults--)].~T();

должно быть --number_of_defaults.

Note: See TracTickets for help on using tickets.