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 Sokolov Viacheslav

Type: ожидается проверкаожидаются исправления

72 namespace Test{
73 using namespace My_vector;

можно было бы поступить иначе:
namespace My_vector::Test

74 std::stringstream test_s;
75 std::stringstream correct_s;

так делать не стоит, глобальные переменные - зло. Можно сделать одним из двух способов:
1) занести внутрь DO_CHECK и, возможно, сделать static (если замысел в том, чтобы памяти поменьше выделялось)
2) сделать template <typename T> std::string to_string(const T& t);
с реализацией через std::stringstream

99 v1.push_back(std::move(T(a)));

здесь move ничего не делает, T(a) - и так rvalue (конкретно xvalue, https://en.cppreference.com/w/cpp/language/implicit_conversion#Temporary_materialization)

9 class my_vector {

final?

27 T operator[](std::size_t index) const;

лучше const T&

43 vector_holder(const vector_holder& other) = delete;
44 vector_holder& operator=(const vector_holder& other) = delete;

rvalue-версии тоже стоит явно удалить

9 std::size_t closest_degree_of_two(std::size_t n) {

здесь потенциально нарушется 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) {

128 if (i < 0
i >= h.len) {

не может быть <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.

comment:2 Changed 4 years ago by 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 }
можно реализовать эффективнее по количеству копирования элементов

comment:3 in reply to:  2 Changed 4 years ago by samoylov.viktor

Type: ожидаются исправленияожидается проверка
Version: 1.02.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:4 Changed 4 years ago by samoylov.viktor

сделал эффективнее resize, если n < h.len

comment:5 Changed 4 years ago by Sokolov Viacheslav

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 samoylov.viktor

Type: ожидаются исправленияожидается проверка
Version: 2.03.0

comment:7 Changed 4 years ago by Sokolov Viacheslav

Resolution: задача сдана
Status: assignedclosed
Note: See TracTickets for help on using tickets.