Opened 4 years ago

Closed 4 years ago

#833 closed ожидаются исправления (задача сдана)

WW #12

Reported by: Gleb Marin Owned by: Sokolov Viacheslav
Component: WW_vector Version: 1.0
Keywords: Cc:

Description


Change History (3)

comment:1 Changed 4 years ago by Sokolov Viacheslav

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

138 if (inner_.size_ + 1 >= inner_.capacity_)

Не выполнено требование

push_back увеличивает размер масива в два раза, когда место закончилось.

11 class my_vector
final?

15 my_vector(const std::size_t size);

explicit

17 my_vector(my_vector &&other);
noexcept

18 my_vector &operator=(my_vector other);
noexcept

29 T &operator[](std::size_t index) const;
const T&. Из const-метода не стоит отдавать что-то мутабельное, теряется const-корректность.

34 void clear() & noexcept;
35 void clear() && noexcept;
какая мотивация разделять rvalue и lvalue версии?

38 void swap(my_vector &&other) & noexcept;
непонятно, зачем нужен такой метод, если есть operator=(my_vector&&)

41 struct my_vector_impl_

final?

43 my_vector_impl_(const std::size_t size = 0);

explicit?

46 my_vector_impl_(const my_vector_impl_ &) = delete;
47 my_vector_impl_ &operator=(const my_vector_impl_ &) = delete;
с rvalue версиями тоже стоит что-нибудь явно сделать

54 my_vector_impl_ inner_;

предлагаю альтернативный вариант именования: storage (сейчас тоже нормально)

38 std::swap(other.inner_.size_, inner_.size_);
39 std::swap(other.inner_.capacity_, inner_.capacity_);
40 std::swap(other.inner_.data_, inner_.data_);

swap(other)?

81 return !inner_.size_;

читабельнее 0 == inner_.size_

95 reserve(n);
96 for (; inner_.size_ < n; ++inner_.size_)
97 {
98 inner_.data_[inner_.size_] = T{};
99 }

с такой реализацией нарушется требование строгой гарантии исключений (если исключение произойдет в очередном T{} - например, out_of_memory). Для реализации этой гарантии нужен временный объект.

105 if (n < inner_.capacity_)
106 {
107 return;
108 }
<=

113 auto newInner{std::make_unique<my_vector_impl_>(inner_.capacity_)};
зачем здесь unique_ptr?

с такой реализацией reserve нарушется требование строгой гарантии исключений (если исключение произойдет в конструкторе my_vector_impl_). Для корректной реализации нужно сначала подготовить временный объект, а только потом как-либо менять текущее состояние.

125 return *(inner_.data_ + index);
assert, что index < size

140 reserve(inner_.size_ * 2);
достаточно reserve(size + 1) - это позволит менять детали реализации (сколько именно памяти резирвировать) при необходимости

вообще самая простая реализация
135 void my_vector<T>::push_back(const T &t)
выглядит так:
push_back(T{t});

160 inner_.data_[--inner_.size_].~T();
assert size > 0

172 template <typename T>
173 void my_vector<T>::clear() && noexcept {}
непонятно, зачем нужен такой метод

183 data_ = static_cast<T *>(std::aligned_alloc(alignof(T), sizeof(T) * capacity_));
какая мотивация использовать aligned_alloc?

Если я правильно понимаю, то задача была сдана перед deadline-ом, соответственно версия 2 - финальная. Поправьте, если ошибаюсь.

comment:2 Changed 4 years ago by Sokolov Viacheslav

35 template <typename T>
36 my_vector<T>::my_vector(my_vector<T> &&other)
37 {
38 std::swap(other.inner_.size_, inner_.size_);
39 std::swap(other.inner_.capacity_, inner_.capacity_);
40 std::swap(other.inner_.data_, inner_.data_);
41 }

чтобы этот конструктор был noexcept, нужно, чтобы my_vector_impl_() был noexcept, а в таком случае можно my_vector() сделать noexcept

вывод с помощью << не соответствует условию, лишний " " в конце

comment:3 Changed 4 years ago by Sokolov Viacheslav

Resolution: задача сдана
Status: assignedclosed
Note: See TracTickets for help on using tickets.