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)
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: | ожидается проверка → ожидаются исправления |
comment:2 Changed 4 years ago by
Owner: | changed from lebedev.egor to Дмитрий Свиридкин |
---|---|
Type: | ожидаются исправления → ожидается проверка |
Version: | 1.0 → 2.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
Owner: | changed from lebedev.egor to Дмитрий Свиридкин |
---|---|
Type: | ожидаются исправления → ожидается проверка |
Version: | 2.0 → 3.0 |
Кажется, все, что было написано, я пофиксил. Кроме next_pot
, считаю pot
нормальной аббревиатурой для степени 2 :(
comment:5 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
resize работает неверно и нарушает гарантии исключений.
8
все-таки что-то падает, смотрите вложение. Код очистки, который должен вызвать деструкторы элементов, внутри конструктора должен быть одинаковым, а у вас разный. Его можно вынести в отдельный метод.
resize, который принимает список аргументов тоже стоит заменить на resize с дефолтным элементом.
Код очистки точно стоит вынести в отдельный метод. Он у вас шесть раз встречается!
А также стоит сделать отдельный метод для реаллокации вектора.
int fmpotgtn(int n) { //find min power of two greater than number
Вот давайте не будем как в старом добром C давать имена, сокращая каждое слово до одной буквы.Сделайте лучше функцию двоичного логарифма (log2_ceil или log2_floor, смотря какая вам нужна)
resize и reserve зачем-то делают перевыделение памяти и копирование, если потребовали уменьшить размер и вмещаемся в capacity()
В условие вроде как требуется, чтоб все возможные увелечитения capacity происходили по степеням двойки.
А копия здесь зачем?
перегрузки операторов лучше делать friend-функциями, чтобы при неудавшихся компиляциях шаблонов они не загаживали сообщения об ошибке.