Ещё чуть-чуть вектора.
Запись от Тамика размещена 01.07.2014 в 13:35
Показов 3781
Комментарии 6
Метки c++
Всем бобрового утра!![]() Кто читает это уже не утром - бобрового дня или вечера. Так вот. Скучным рабочим утром решила стряхнуть пыль с проекта под названием int_array. И малость его доработать. Были внесены следующие изменения: 1) Убрана недоработка, на которую указал SatanaXIII. 2) Использованы ценные советы Jupiter. 3) Усовершенствован конструктор - теперь он не просто принимает размер будущего вектора, а может еще и принимать желаемое значение! 4) Изменила возвращаемые значения у getSize() и getCapacity - раз уж они у нас должны быть более нуля, то сняла их с int и посадила на size_t. Изменения не существенны, однако это ещё один шаг к улучшению вектора. В следующем сезоне "Таня и Вектор" - обобщение класса и превращение его в шаблон. И снова внимательно прислушиваюсь к комментариям старших. Спасибо за внимание! ![]() Итак. Сосбна, хедерок.
| ||||||||||
Метки c++
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 6
Комментарии
-
1) Я ж вот здесь вот как-то говорил уже, что раз есть throw() в описании, то должен быть и в реализации в реализации. Это ж две разные функции получаются:
Представленный код тупо не запустится.C++ 1 2
void IntVector::swap(IntVector& in) void IntVector::swap(IntVector& in) throw()
2) Вот это вот замечание HighPredator тоже прошло без внимания. Зачем два механизма? Дефайнов вполне достаточно.
3) Многие старые компиляторы не подключают по умолчанию заголовки для работы с size_t. Можно перед классом это проверить. Хотя заместо этого так же можно и подключаемые модули перенести в хедер. Они-то обладают знаниями о size_t.
4) Зачем опять указывать область видимости внутри себя же:C++ 1 2 3 4 5 6 7 8 9 10 11 12
//#include <stdexcept> //#include <algorithm> #ifndef __STDDEF_H #include <stddef.h> #endif class IntVector { int *mas; size_t size, capacity; public:
5) Метод resize просто выбрасывает кусок памяти, если новый размер меньше старого, что приведет к утечкам. Лучше использовать какой-нибудь метод типа erase_item для каждого элемента. Но это забегая вперед.C++ 11
/*IntVector::*/IntVector();
6) Метод clear тоже самое. Даже массив не очищает.
7) Ну и чтобы было чем заняться после прикручивания шаблона - итератор.
8) P.S. Ыыыыы:
За заполнение вектора списком без примочек одиннадцатого стандарта многие б сказали спасибо.C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#ifndef __STDARG_H #include <stdarg.h> #endif IntVector::IntVector( int count, int item, ... ) : size(0), capacity(count) { mas = new int[count]; va_list p; va_start( p, count ); while( count-- ) this->pushBack( va_arg( p, int ) ); va_end(p); }
Запись от SatanaXIII размещена 02.07.2014 в 14:33
-
Некоторые пункты подправила, спасибо.
Сообщение от SatanaXIII
По поводу resize и clear - совсем непонятно. Никаких утечек там не предвидится. С чего Вы взяли?Запись от Тамика размещена 02.07.2014 в 15:04
-
Запись от SatanaXIII размещена 02.07.2014 в 16:19
-
Запись от SatanaXIII размещена 02.07.2014 в 16:50
-
Ну вот.
Сообщение от SatanaXIII
А со swap ещё будет беседа. Еще прошлый раз думала написать свой. Но руки не дошли. Так что в следующей серии будет персональный своп.Запись от Тамика размещена 02.07.2014 в 16:57
-
Внесу свою лепту:
нет const версии at, в результате чего нельзя использовать at у константных объектов:
В циклах сравнивание значения типа int со значением типа size_t. Чем это чревато? Тем, что если в переменной size_t лежит значение больше максимального значения, представимого типом int, то цикл будет бесконечным, т.к. переменная типа int просто будет переполняться и "уходить в минуса". Попробуйте просто для примера:C++ 1 2
const IntVector vec ; int value = vec.at(3) ; //Ошибка vec - константный объект
Также, нет ограничения на максимальный размер. Вектор не может быть бесконечнымC++ 1 2 3 4 5
int main(){ size_t f = static_cast<size_t>( std::numeric_limits<int>::max() ) + 1 ; for ( int i = 0 ; i < f ; i+=10000 ) std::cout << i << std::endl ; }
В стандартном векторе константные front и back возвращают ссылки на элемент, а не копии объектов:
C++ 1 2
const_reference back() const; const_reference front() const;
В конструкторе копий:
наверное, лучше будет уравнять size и capacity, иначе невозможно будет "обрезать" память как в стандартном векторе с помощью swap'аC++ 1 2 3 4 5 6 7 8
IntVector::IntVector(const IntVector& in) { size = in.size; capacity = in.capacity; mas = new int[capacity]; for (int i = 0; i < size; ++i) mas[i] = in.mas[i]; }
C++ 1
IntVector(vec).swap(vec) ;//capacity не изменяется.
Можно еще реализовать конструктор, принимающий интервал [begin,end)
С учетом этого нужно было сразу делать, иначе придется почти весь класс переписать. И это относится не только к изменению типа int на T, а придется переосмыслить структуру всего классаЗапись от Croessmah размещена 06.07.2014 в 20:43



