Opened 4 years ago
Closed 4 years ago
#816 closed ожидается проверка (задача сдана)
WW #12
Reported by: | samoylov.viktor | Owned by: | Sokolov Viacheslav |
---|---|---|---|
Component: | WW_vector | Version: | 3.0 |
Keywords: | Cc: |
Description
Закомментировал тест с bad_alloc, так как valgrind не умеет ловить исключения. Если его откомментировать, то без valgrind всё будет успешно ловиться и тестироваться.
Change History (7)
comment:1 Changed 4 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 follow-up: 3 Changed 4 years ago by
104 template<typename T>
105 void my_vector<T>::reserve(std::size_t n) {
106 if (n <= h.cap)
107 return;
108 vector_holder tmp(closest_degree_of_two(n));
109 for (; tmp.len < h.len; tmp.len++) {
110 new (tmp.data + tmp.len) T(h.data[tmp.len]);
111 }
112 h.swap(tmp);
113 }
можно реализовать эффективнее по количеству копирования элементов
comment:3 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
Replying to Sokolov Viacheslav:
104 template<typename T>
105 void my_vector<T>::reserve(std::size_t n) {
106 if (n <= h.cap)
107 return;
108 vector_holder tmp(closest_degree_of_two(n));
109 for (; tmp.len < h.len; tmp.len++) {
110 new (tmp.data + tmp.len) T(h.data[tmp.len]);
111 }
112 h.swap(tmp);
113 }
можно реализовать эффективнее по количеству копирования элементов
Я так понял, здесь подразумевался std::move, всё остальное исправил.
comment:5 Changed 4 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
101 v1.push_back(std::move(T(b)));
107 my_vector<T> v3(std::move(my_vector<T>(v1)));
эти std::move ничего не делают
18 size_t ans = 1;
19 return (ans << i);
проще return size_t{1} << i;
17 i -= (count == 1);
вместо этого можно было бы изначально уменьшить n на 1
102 my_vector<T> tmp(n);
103 for (std::size_t i = 0; i < h.len; i++) {
104 tmp.h.data[i] = std::move(h.data[i]);
105 }
можно было бы звать конструктор по умолчанию не n раз, а n - len, но можно и так оставить.
По условию operator<< не должен выводить пробел после последнего элемента.
comment:6 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 2.0 → 3.0 |
comment:7 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
можно было бы поступить иначе:
namespace My_vector::Test
так делать не стоит, глобальные переменные - зло. Можно сделать одним из двух способов:
1) занести внутрь DO_CHECK и, возможно, сделать static (если замысел в том, чтобы памяти поменьше выделялось)
2) сделать template <typename T> std::string to_string(const T& t);
с реализацией через std::stringstream
здесь move ничего не делает, T(a) - и так rvalue (конкретно xvalue, https://en.cppreference.com/w/cpp/language/implicit_conversion#Temporary_materialization)
final?
лучше const T&
rvalue-версии тоже стоит явно удалить
здесь потенциально нарушется ODR. Компилируется только потому, что всего 1 единица компиляции. Реализацию можно существенно упростить. Кажется, для n > std::numeric_limits<size_t>::max() / 2 вернет 0. Стоит зафиксировать предусловие.
108 vector_holder tmp(closest_degree_of_two(n));
109 for (; tmp.len < h.len; tmp.len++) {
110 new (tmp.data + tmp.len) T(h.data[tmp.len]);
111 }
112 h.swap(tmp);
можно эффективнее с помощью std::move (я про строчку 110)
если n < h.len, resize можно сделать эффективне; в любом случае move использовать предпочтительнее, чем копирование
127 T& my_vector<T>::operator[](std::size_t i) {
не может быть <0
143 void my_vector<T>::push_back(const T& t) {
эта версия очень неэффективно реализована. Простая и эффективная реализация:
push_back(T{t});
154 if (h.len == h.cap)
155 this->reserve(h.len + 1);
можно без if.