shizaero

Untitled

Aug 18th, 2023
1,121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.70 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <initializer_list>
  4. #include "array_ptr.h"
  5. #include <stdexcept>
  6.  
  7. template <typename Type>
  8. class SimpleVector {
  9. private:
  10.     ArrayPtr<Type> data;
  11.     size_t size_;
  12.     size_t capacity_;
  13. public:
  14.     using Iterator = Type*;
  15.     using ConstIterator = const Type*;
  16.  
  17.     SimpleVector() noexcept : data(nullptr), size_(0), capacity_(0) {}
  18.  
  19.     // Создаёт вектор из size элементов, инициализированных значением по умолчанию
  20.     explicit SimpleVector(size_t size) {
  21.         this->size_ = size;
  22.         this->capacity_ = size;
  23.        
  24.         ArrayPtr<Type> new_data(size);
  25.         for (size_t i = 0; i < size; ++i) {
  26.                 new_data[i] = Type{};  // Initialize new elements with default value
  27.             }
  28.         data.swap(new_data);
  29.     }
  30.  
  31.     // Создаёт вектор из size элементов, инициализированных значением value
  32.     SimpleVector(size_t size, const Type& value) {
  33.         this->size_ = size;
  34.         this->capacity_ = size;
  35.        
  36.         ArrayPtr<Type> new_data(size);
  37.         data.swap(new_data);
  38.        
  39.         for(size_t i = 0; i < size; ++i){
  40.             data[i] = value;
  41.         }
  42.     }
  43.  
  44.     // Создаёт вектор из std::initializer_list
  45.     SimpleVector(std::initializer_list<Type> init) {
  46.         this->size_ = init.size();
  47.         this->capacity_ = init.size();
  48.        
  49.         ArrayPtr<Type> new_data(size_);
  50.         data.swap(new_data);
  51.        
  52.         size_t i = 0;
  53.         for (const auto& item : init) {
  54.             data[i++] = item;
  55.         }
  56.     }
  57.    
  58.     SimpleVector(const SimpleVector& other)
  59.      : size_(other.size_), capacity_(other.capacity_)
  60.     {
  61.         ArrayPtr<Type> new_data(size_);
  62.         for(size_t i = 0; i < size_; ++i){
  63.             new_data[i] = other.data[i];
  64.         }
  65.         data.swap(new_data);
  66.     }
  67.  
  68.     SimpleVector& operator=(const SimpleVector& rhs) {
  69.         if (this == &rhs) {
  70.             return *this;
  71.         }
  72.         SimpleVector temp(rhs);
  73.         swap(temp);
  74.         return *this;
  75.     }
  76.  
  77.     // Добавляет элемент в конец вектора
  78.     // При нехватке места увеличивает вдвое вместимость вектора
  79.     void PushBack(const Type& item) {
  80.         if (size_ == capacity_) {
  81.             // Увеличиваем вместимость вдвое
  82.             size_t new_capacity = capacity_ == 0 ? 1 : capacity_ * 2;
  83.             Resize(new_capacity);
  84.             size_ += 1;
  85.         }
  86.         if (size_ < capacity_)
  87.         {
  88.             data[size_++] = item;
  89.         }
  90.         data[size_ - 1] = item;
  91.     }
  92.  
  93.     // Вставляет значение value в позицию pos.
  94.     // Возвращает итератор на вставленное значение
  95.     // Если перед вставкой значения вектор был заполнен полностью,
  96.     // вместимость вектора должна увеличиться вдвое, а для вектора вместимостью 0 стать равной 1
  97.     Iterator Insert(ConstIterator pos, const Type& value) {
  98.         size_t index = pos - data.Get();
  99.  
  100.         if (size_ == capacity_) {
  101.             size_t new_capacity = capacity_ == 0 ? 1 : capacity_ * 2;
  102.             Resize(new_capacity);
  103.             size_ += 1;
  104.         }
  105.  
  106.         for (size_t i = size_; i > index; --i) {
  107.             data[i] = data[i - 1];
  108.         }
  109.  
  110.         data[index] = value;
  111.  
  112.         return data.Get() + index;
  113.     }
  114.  
  115.     // "Удаляет" последний элемент вектора. Вектор не должен быть пустым
  116.     void PopBack() noexcept {
  117.          if (size_ > 0) {
  118.             --size_;
  119.         }
  120.     }
  121.  
  122.     // Удаляет элемент вектора в указанной позиции
  123.     Iterator Erase(ConstIterator pos) {
  124.          size_t index = pos - data.Get();
  125.  
  126.         if (index >= size_) {
  127.             return end();
  128.         }
  129.  
  130.         for (size_t i = index; i < size_ - 1; ++i) {
  131.             data[i] = data[i + 1];
  132.         }
  133.  
  134.         --size_;
  135.  
  136.         return data.Get() + index;
  137.     }
  138.  
  139.     // Обменивает значение с другим вектором
  140.     void swap(SimpleVector& other) noexcept {
  141.         data.swap(other.data);
  142.         std::swap(size_, other.size_);
  143.         std::swap(capacity_, other.capacity_);
  144.     }
  145.  
  146.     // Возвращает количество элементов в массиве
  147.     size_t GetSize() const noexcept {
  148.         return size_;
  149.     }
  150.  
  151.     // Возвращает вместимость массива
  152.     size_t GetCapacity() const noexcept {
  153.         return capacity_;
  154.     }
  155.  
  156.     // Сообщает, пустой ли массив
  157.     bool IsEmpty() const noexcept {
  158.         return size_ == 0;
  159.     }
  160.  
  161.     // Возвращает ссылку на элемент с индексом index
  162.     Type& operator[](size_t index) noexcept{
  163.         return data[index];
  164.     }
  165.  
  166.     // Возвращает константную ссылку на элемент с индексом index
  167.     const Type& operator[](size_t index) const  noexcept{
  168.         return data[index];
  169.     }
  170.  
  171.     // Возвращает константную ссылку на элемент с индексом index
  172.     // Выбрасывает исключение std::out_of_range, если index >= size
  173.     Type& At(size_t index) {
  174.         if (index >= size_) {
  175.             throw std::out_of_range("Index out of range");
  176.         }
  177.         return data[index];
  178.     }
  179.  
  180.     // Возвращает константную ссылку на элемент с индексом index
  181.     // Выбрасывает исключение std::out_of_range, если index >= size
  182.     const Type& At(size_t index) const {
  183.         if (index >= size_) {
  184.             throw std::out_of_range("Index out of range");
  185.         }
  186.         return data[index];
  187.     }
  188.  
  189.     // Обнуляет размер массива, не изменяя его вместимость
  190.     void Clear() noexcept {
  191.         size_ = 0;
  192.     }
  193.  
  194.     // Изменяет размер массива.
  195.     // При увеличении размера новые элементы получают значение по умолчанию для типа Type
  196.     void Resize(size_t new_size) {
  197.          if (new_size > capacity_) {
  198.             ArrayPtr<Type> new_data(new_size);
  199.             for (size_t i = 0; i < size_; ++i) {
  200.                 new_data[i] = data[i];
  201.             }
  202.             for (size_t i = size_; i < new_size; ++i) {
  203.                 new_data[i] = Type();  // Initialize new elements with default value
  204.             }
  205.             data.swap(new_data);
  206.             capacity_ = new_size;
  207.         }
  208.         if(new_size < size_) std::fill(data.Get() + new_size, data.Get() + size_, 0);
  209.         size_ = new_size;
  210.     }
  211.  
  212.     // Возвращает итератор на начало массива
  213.     // Для пустого массива может быть равен (или не равен) nullptr
  214.     Iterator begin() noexcept {
  215.         return data.Get();
  216.     }
  217.  
  218.     // Возвращает итератор на элемент, следующий за последним
  219.     // Для пустого массива может быть равен (или не равен) nullptr
  220.     Iterator end() noexcept {
  221.         return data.Get() + size_;
  222.     }
  223.  
  224.     // Возвращает константный итератор на начало массива
  225.     // Для пустого массива может быть равен (или не равен) nullptr
  226.     ConstIterator begin() const noexcept {
  227.         return data.Get();
  228.     }
  229.  
  230.     // Возвращает итератор на элемент, следующий за последним
  231.     // Для пустого массива может быть равен (или не равен) nullptr
  232.     ConstIterator end() const noexcept {
  233.         return data.Get() + size_;
  234.     }
  235.  
  236.     // Возвращает константный итератор на начало массива
  237.     // Для пустого массива может быть равен (или не равен) nullptr
  238.     ConstIterator cbegin() const noexcept {
  239.         return begin();
  240.     }
  241.  
  242.     // Возвращает итератор на элемент, следующий за последним
  243.     // Для пустого массива может быть равен (или не равен) nullptr
  244.     ConstIterator cend() const noexcept {
  245.         return end();
  246.     }
  247. };
  248.  
  249. template <typename Type>
  250. inline bool operator==(const SimpleVector<Type>& lhs, const SimpleVector<Type>& rhs) {
  251.     if (lhs.GetSize() != rhs.GetSize())
  252.     {
  253.         return false;
  254.     }
  255.    
  256.     return std::equal(lhs.begin(), lhs.end(), rhs.begin());
  257. }
  258.  
  259. template <typename Type>
  260. inline bool operator!=(const SimpleVector<Type>& lhs, const SimpleVector<Type>& rhs) {
  261.     return !(lhs == rhs);
  262. }
  263.  
  264. template <typename Type>
  265. inline bool operator<(const SimpleVector<Type>& lhs, const SimpleVector<Type>& rhs) {
  266.     return std::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
  267. }
  268.  
  269. template <typename Type>
  270. inline bool operator<=(const SimpleVector<Type>& lhs, const SimpleVector<Type>& rhs) {
  271.     return !(lhs > rhs);
  272. }
  273.  
  274. template <typename Type>
  275. inline bool operator>(const SimpleVector<Type>& lhs, const SimpleVector<Type>& rhs) {
  276.     return rhs < lhs;
  277. }
  278.  
  279. template <typename Type>
  280. inline bool operator>=(const SimpleVector<Type>& lhs, const SimpleVector<Type>& rhs) {
  281.     return !(lhs < rhs);
  282. }
Advertisement
Add Comment
Please, Sign In to add comment