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
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
comment:3 Changed 4 years ago by
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
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 2.0 → 3.0 |
Все исправил. Константу на дефолтный размер убирать не стал, так как ее удобно гибко менять, но для соответствия условию она теперь равна 1.
comment:5 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
90 array_[source.size_ + (number_of_defaults--)].~T();
должно быть --number_of_defaults.
Тесты не покрывают operator=(&&) и []const.
это конструктор, а не operator =.
Поля инициализируются мусором. Нужно сначала позвать делигирующий конструктор по-умолчанию.
не понятно, чем это лучше, чем std::bad_alloc. Нехватка памяти - это не проблема при работе конкретно с вектором, а проблема системы целиком. Обрабатывать эту проблему удобнее одинаковым образом.
14 : capacity_{capacity}, size_{0}, array_{reinterpret_cast<T *>(aligned_alloc(
какая мотивация использовать aligned_alloc?
выравнивание кода выглядит ужасно
кажется, нет смысла звать этот конструктор с capacity==0
здесь позовется T::T(T&) / T::T(const T&).
Нужен std::move.
https://stackoverflow.com/questions/10876930/should-one-never-use-static-inline-function
пустая строка..
Если DEFAULT_CAPACITY предполагается степенью двойки, стоит поставить на это static_assert
152 while (size() < n) {
153 vector_holder_.place_default();
154 }
здесь может произойти исключение и строгая гарантия будет нарушена. Нужно аккуратнее обработать это место.
165 vector_holder_.place_object(t);
std::move