Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Задание 1
- Создать шаблонный класс-контейнер Array, который представляет собой массив,
- позволяющий хранить объекты заданного типа.
- Класс должен реализовывать следующие функции:
- ■ GetSize – получение размера массива (количество элементов,
- под которые выделена память);
- ■ SetSize(int size, int grow = 1) – установка размера массива
- (если параметр size больше предыдущего размера массива, то
- выделяется дополнительный блок памяти, если нет, то «лишние» элементы теряются
- и память освобождается); параметр grow определяет для какого количества элементов
- необходимо выделить память, если количество элементов превосходит текущий размер
- массива. Например, SetSize(5, 5); означает, что при добавлении 6-го элемента размер
- массива становится равным 10, при добавлении 11-го - 15 и т. д.;
- ■ GetUpperBound - получение последнего допустимого индекса в массиве. Например,
- если при размере массива 10, вы добавляете в него 4 элемента, то функция вернет 3;
- ■ IsEmpty - массив пуст?;
- ■ FreeExtra - удалить «лишнюю» память (выше последнего допустимого индекса);
- ■ RemoveAll – удалить все;
- ■ GetAt -получение определенного элемента (по индексу);
- ■ SetAt – установка нового значения для определенного элемента (индекс элемента должен
- быть меньше текущего размера массива);
- ■ operator [] – для реализации двух предыдущих функций;
- ■ Add – добавление элемента в массив (при необходимости
- массив увеличивается на значение grow функции SetSize);
- ■ Append – «сложение» двух массивов;
- ■ operator =;
- ■ GetData – получения адреса массива с данными;
- ■ InsertAt – вставка элемента(-ов) в заданную позицию;
- ■ RemoveAt – удаление элемента(-ов) с заданной позиции.
- Реализовать сематнику копирования, перемещения, const-семантику!!!
- #include <iostream>
- template<typename ElemT>
- class Array
- {
- ElemT* arr;
- size_t capacity;
- size_t currentSize;
- public:
- Array(size_t capacityP) : arr{ new ElemT[capacityP] }, capacity{ capacityP }, currentSize{0}{}
- Array() : Array(5) {}
- Array(const Array& object);
- Array(Array&& object);
- Array& operator=(const Array& object);
- Array& operator=(Array&& object);
- size_t getSize()const { return capacity; }
- void setSize(size_t newCurrentSize, size_t grow = 5)
- {
- if (!(newCurrentSize > currentSize and newCurrentSize < capacity))
- {
- if (newCurrentSize > capacity) { capacity = newCurrentSize + grow; }
- else if (newCurrentSize < currentSize) { capacity = newCurrentSize; }
- auto newArr{ new ElemT[capacity] };
- for (size_t i{ 0 }; i < currentSize; ++i)
- {
- *(newArr + i) = *(arr + i);
- }
- delete[] arr;
- arr = newArr;
- }
- currentSize = newCurrentSize;
- }
- size_t getUpperBound()const { return currentSize - 1; }
- bool isEmpty()const { return currentSize == 0 ? true : false; }
- void freeExtra();
- void removeAll();
- //ElemT& getAt(size_t idx)const { return *(arr + idx); }
- //bool setAt(size_t idx, const ElemT& val)
- //{
- // if (idx < currentSize) { *(arr + idx) = val; return true; }
- // else { return false; }
- //}
- ElemT& operator[](size_t idx) { return*(arr + idx); }
- const ElemT& operator[](size_t idx)const { return *(arr + idx); }
- void add(const ElemT& val);
- void insertAt(size_t insertIdx, const ElemT& val);
- void removeAt(size_t removeIdx);
- void append(const Array& object);
- ElemT* getData()const { return arr; }
- template <typename ElemT>
- friend std::ostream& operator<<(std::ostream& out, const Array<ElemT>& object);
- template <typename ElemT>
- friend std::istream& operator>>(std::istream& in, const Array<ElemT>& object);
- void randomize();
- ~Array() { delete[]arr; }
- };
- template <typename ElemT>
- Array<ElemT>::Array(const Array& object)
- : arr{ new ElemT[object.capacity] }, capacity{ object.capacity }, currentSize{ object.currentSize }
- {
- for (size_t i{ 0 }; i < currentSize; ++i)
- {
- *(arr + i) = *(object.arr + i);
- }
- }
- template <typename ElemT>
- Array<ElemT>::Array(Array&& object)
- : arr{ object.arr }, capacity{ object.capacity }, currentSize{ object.currentSize }
- {
- object.arr = nullptr;
- object.capacity = 0;
- object.currentSize = 0;
- }
- template <typename ElemT>
- Array<ElemT>& Array<ElemT>::operator=(const Array& object)
- {
- if (!(this == &object))
- {
- if (capacity != object.capacity)
- {
- delete[] arr;
- arr = new ElemT[object.capacity];
- }
- capacity = object.capacity;
- currentSize = object.currentSize;
- for (size_t i{ 0 }; i < currentSize; ++i)
- {
- *(arr + i) = *(object.arr + i);
- }
- }
- return *this;
- }
- template <typename ElemT>
- Array<ElemT>& Array<ElemT>::operator=(Array&& object)
- {
- if (!(this == &object))
- {
- delete[] arr;
- arr = object.arr;
- capacity = object.capacity;
- currentSize = object.currentSize;
- object.arr = nullptr;
- object.capacity = 0;
- object.currentSize = 0;
- }
- return *this;
- }
- template <typename ElemT>
- void Array<ElemT>::freeExtra()
- {
- capacity = currentSize;
- auto newArr{ new ElemT[capacity] };
- for (size_t i{ 0 }; i < currentSize; ++i)
- {
- *(newArr + i) = *(arr + i);
- }
- delete[] arr;
- arr = newArr;
- }
- template <typename ElemT>
- void Array<ElemT>::removeAll()
- {
- for (; currentSize; --currentSize)
- {
- arr[currentSize - 1] = 0;
- }
- }
- template <typename ElemT>
- void Array<ElemT>::add(const ElemT& val)
- {
- setSize(currentSize + 1);
- *(arr + currentSize - 1) = val;
- }
- template <typename ElemT>
- void Array<ElemT>::insertAt(size_t insertIdx, const ElemT& val)
- {
- setSize(currentSize + 1);
- for (size_t i{ currentSize - 1 }; i > insertIdx; --i)
- {
- *(arr + i) = *(arr + i - 1);
- }
- *(arr + insertIdx) = val;
- }
- template <typename ElemT>
- void Array<ElemT>::removeAt(size_t removeIdx)
- {
- for (size_t i{ removeIdx }; i < currentSize; ++i)
- {
- *(arr + i) = *(arr + i + 1);
- }
- --currentSize;
- }
- template <typename ElemT>
- void Array<ElemT>::append(const Array& object)
- {
- size_t oldSize{ currentSize };
- setSize(currentSize + object.currentSize);
- for (size_t i{ oldSize }, j{ 0 }; i < currentSize; ++i, ++j)
- {
- *(arr + i) = *(object.arr + j);
- }
- }
- template <typename ElemT>
- std::ostream& operator<<(std::ostream& out, const Array<ElemT>& object)
- {
- if (!object.capacity and !object.arr) { out << "[EMPTY]\n"; return out; }
- for (size_t i{ 0 }; i < object.currentSize; ++i)
- {
- out << *(object.arr + i) << ' ';
- }
- out << '\n';
- return out;
- }
- template <typename ElemT>
- std::istream& operator>>(std::istream& in, const Array<ElemT>& object)
- {
- if (!object.capacity and !object.arr) { std::cout << "[EMPTY]\n"; return in; }
- std::cout << "Enter array elements one by one\n";
- for (size_t i{ 0 }; i < object.currentSize; ++i)
- {
- in >> *(object.arr + i);
- }
- return in;
- }
- template <typename ElemT>
- void Array<ElemT>::randomize()
- {
- for (; currentSize < capacity; ++currentSize)
- {
- arr[currentSize] = rand() % 10;
- }
- }
- template <typename ElemT>
- Array<ElemT> arrayFactory(size_t arrSize)
- {
- Array<ElemT> arrObject{ arrSize };
- arrObject.randomize();
- return arrObject;
- }
- int main()
- {
- Array<int> arr_1;
- arr_1 = arrayFactory<int>(5);
- std::cout << "\033[1;34m" << "Array #1:\n" << "\033[0m" << arr_1;
- std::cout << "Array #1 capacity is " << arr_1.getSize() << " elements\n";
- std::cout << "The last valid index array #1 is - " << arr_1.getUpperBound() << '\n';
- std::cout << "Is Array #1 empty ? " << std::boolalpha << arr_1.isEmpty() << '\n';
- std::cout << "\nArray's #1 data is - " << arr_1.getData() << '\n';
- std::cout << "\nChange array's #1 element:\n";
- arr_1[3] = 33;
- std::cout << arr_1;
- std::cout << "\nAdd element in array #1:\n";
- arr_1.add(55);
- std::cout << arr_1;
- std::cout << "Array #1 capacity is " << arr_1.getSize() << " elements\n";
- std::cout << "The last valid index array #1 is - " << arr_1.getUpperBound() << '\n';
- std::cout << "\nInsert element in array #1:\n";
- arr_1.insertAt(2, 77);
- std::cout << arr_1;
- std::cout << "Array #1 capacity is " << arr_1.getSize() << " elements\n";
- std::cout << "The last valid index array #1 is - " << arr_1.getUpperBound() << '\n';
- std::cout << "\nRemove element from array #1:\n";
- arr_1.removeAt(2);
- std::cout << arr_1;
- std::cout << "Array #1 capacity is " << arr_1.getSize() << " elements\n";
- std::cout << "The last valid index is - " << arr_1.getUpperBound() << '\n';
- std::cout << "\nFree up extra memory array #1\n";
- arr_1.freeExtra();
- std::cout << arr_1;
- std::cout << "Array capacity is " << arr_1.getSize() << " elements\n";
- std::cout << "The last valid index array #1 is - " << arr_1.getUpperBound() << '\n';
- std::cout << '\n';
- Array<int> arr_2;
- arr_2 = arrayFactory<int>(10);
- std::cout << "\033[1;34m" << "Array #2:\n" << "\033[0m" << arr_2;
- std::cout << "Array #2 capacity is " << arr_2.getSize() << " elements\n";
- std::cout << "The last valid index array #2 is - " << arr_2.getUpperBound() << '\n';
- std::cout << "\nArray's #2 data is - " << arr_2.getData() << '\n';
- std::cout << "\033[1;33m" << "\nAdding two arrays (array #1 + array #2):\n" << "\033[0m";
- arr_1.append(arr_2);
- std::cout << arr_1;
- std::cout << "Array #1 capacity is " << arr_1.getSize() << " elements\n";
- std::cout << "The last valid index array #1 is - " << arr_1.getUpperBound() << '\n';
- std::cout << "\nArray's #1 data is - " << arr_1.getData() << '\n';
- std::cout << "\nRemoving all element from array #2:\n";
- arr_2.removeAll();
- std::cout << "Array #2 capacity is " << arr_2.getSize() << " elements\n";
- std::cout << "The last valid index array #2 is - " << arr_2.getUpperBound() << '\n';
- std::cout << "Is Array #2 empty ? " << std::boolalpha << arr_2.isEmpty() << '\n';
- std::cout << "\nArray's #2 data is - " << arr_2.getData() << '\n';
- std::cout << '\n';
- arr_2 = arrayFactory<int>(10);
- std::cout << arr_2;
- std::cout << "Array #2 capacity is " << arr_2.getSize() << " elements\n";
- std::cout << "The last valid index array #2 is - " << arr_2.getUpperBound() << '\n';
- std::cout << "Is Array #2 empty ? " << std::boolalpha << arr_2.isEmpty() << '\n';
- std::cout << "\nArray's #2 data is - " << arr_2.getData() << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement