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
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 4 years ago by
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
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Note: See
TracTickets for help on using
tickets.
138 if (inner_.size_ + 1 >= inner_.capacity_)
Не выполнено требование
11 class my_vector
final?
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&&)
final?
explicit?
46 my_vector_impl_(const my_vector_impl_ &) = delete;
47 my_vector_impl_ &operator=(const my_vector_impl_ &) = delete;
с rvalue версиями тоже стоит что-нибудь явно сделать
предлагаю альтернативный вариант именования: storage (сейчас тоже нормально)
swap(other)?
читабельнее 0 == inner_.size_
с такой реализацией нарушется требование строгой гарантии исключений (если исключение произойдет в очередном 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 - финальная. Поправьте, если ошибаюсь.