Opened 4 years ago

Closed 4 years ago

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

WW #12

Reported by: lebedev.egor Owned by: Дмитрий Свиридкин
Component: WW_vector Version: 3.0
Keywords: Cc:

Description

Оно собирается, не падает, не течет, но выглядит ужасно...

Attachments (1)

05_test_resize.vg (3.2 KB) - added by Дмитрий Свиридкин 4 years ago.

Download all attachments as: .zip

Change History (6)

Changed 4 years ago by Дмитрий Свиридкин

Attachment: 05_test_resize.vg added

comment:1 Changed 4 years ago by Дмитрий Свиридкин

Owner: changed from Дмитрий Свиридкин to lebedev.egor
Type: ожидается проверкаожидаются исправления

все-таки что-то падает, смотрите вложение. Код очистки, который должен вызвать деструкторы элементов, внутри конструктора должен быть одинаковым, а у вас разный. Его можно вынести в отдельный метод.

template<class... Args>
my_vector<T>::my_vector(size_t n, Args&... args)
  1. Скорее всего должно быть &&.
  2. Этот конструктор лучше все-таки убрать. Вдруг у конструктора элементов есть побочные эффекты, модифицирующие аргументы? Что тогда будет при n > 1?

resize, который принимает список аргументов тоже стоит заменить на resize с дефолтным элементом.

Код очистки точно стоит вынести в отдельный метод. Он у вас шесть раз встречается!
А также стоит сделать отдельный метод для реаллокации вектора.

int fmpotgtn(int n) { //find min power of two greater than number Вот давайте не будем как в старом добром C давать имена, сокращая каждое слово до одной буквы.
Сделайте лучше функцию двоичного логарифма (log2_ceil или log2_floor, смотря какая вам нужна)

resize и reserve зачем-то делают перевыделение памяти и копирование, если потребовали уменьшить размер и вмещаемся в capacity()

В условие вроде как требуется, чтоб все возможные увелечитения capacity происходили по степеням двойки.

template<class T>
std::ostream& operator<<(std::ostream& os, my_vector<T> v) {

А копия здесь зачем?

перегрузки операторов лучше делать friend-функциями, чтобы при неудавшихся компиляциях шаблонов они не загаживали сообщения об ошибке.

Last edited 4 years ago by Дмитрий Свиридкин (previous) (diff)

comment:2 Changed 4 years ago by lebedev.egor

Owner: changed from lebedev.egor to Дмитрий Свиридкин
Type: ожидаются исправленияожидается проверка
Version: 1.02.0

Добавил my_vector_holder
Поправил баги всякие, теперь падать не должно. capacity_ теперь всегда степень двойки или 0. Надеюсь, что оно компилируется.

comment:3 Changed 4 years ago by Дмитрий Свиридкин

Owner: changed from Дмитрий Свиридкин to lebedev.egor
Type: ожидается проверкаожидаются исправления

int next_pot(int n) { // Кажется, название стало гараздо лучше -- следующий котел?

reserve(n), если n -- степень двойки, выделит в два раза больше памяти.

в reserve нужно делать move элементов

resize не работает, если size() < n <= capacity()

resize на уменьшение приводит к UB.

my_vector<T>::my_vector(size_t n) этот конструктор не добитвает capacity до степени двойки

push_back приводик к UB, если текущий размер -- степень двойки.

в clear -- UB.

оператор вывода выводит лишний пробел.

comment:4 Changed 4 years ago by lebedev.egor

Owner: changed from lebedev.egor to Дмитрий Свиридкин
Type: ожидаются исправленияожидается проверка
Version: 2.03.0

Кажется, все, что было написано, я пофиксил. Кроме next_pot, считаю pot нормальной аббревиатурой для степени 2 :(

comment:5 Changed 4 years ago by Дмитрий Свиридкин

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

resize работает неверно и нарушает гарантии исключений.


8

Note: See TracTickets for help on using tickets.