shizaero

Untitled

Aug 18th, 2023
794
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.75 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_ = 0;
  12.     size_t capacity_ = 0;
  13. public:
  14.     using Iterator = Type*;
  15.     using ConstIterator = const Type*;
  16.  
  17.     SimpleVector() noexcept = default;
  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.         data.swap(new_data);
  26.     }
  27.  
  28.     // Создаёт вектор из size элементов, инициализированных значением value
  29.     SimpleVector(size_t size, const Type& value) {
  30.         this->size_ = size;
  31.         this->capacity_ = size;
  32.        
  33.         ArrayPtr<Type> new_data(size);
  34.         data.swap(new_data);
  35.        
  36.         for(size_t i = 0; i < size; ++i){
  37.             data[i] = value;
  38.         }
  39.     }
  40.  
  41.     // Создаёт вектор из std::initializer_list
  42.     SimpleVector(std::initializer_list<Type> init) {
  43.         this->size_ = init.size();
  44.         this->capacity_ = init.size();
  45.        
  46.         ArrayPtr<Type> new_data(size_);
  47.         data.swap(new_data);
  48.        
  49.         size_t i = 0;
  50.         for (const auto& item : init) {
  51.             data[i++] = item;
  52.         }
  53.     }
  54.  
  55.     // Возвращает количество элементов в массиве
  56.     size_t GetSize() const noexcept {
  57.         return size_;
  58.     }
  59.  
  60.     // Возвращает вместимость массива
  61.     size_t GetCapacity() const noexcept {
  62.         return capacity_;
  63.     }
  64.  
  65.     // Сообщает, пустой ли массив
  66.     bool IsEmpty() const noexcept {
  67.         return size_ == 0;
  68.     }
  69.  
  70.     // Возвращает ссылку на элемент с индексом index
  71.     Type& operator[](size_t index)  {
  72.         if (index >= size_) {
  73.             throw std::out_of_range("Index out of range");
  74.         }
  75.         return data[index];
  76.     }
  77.  
  78.     // Возвращает константную ссылку на элемент с индексом index
  79.     const Type& operator[](size_t index) const  {
  80.         if (index >= size_) {
  81.             throw std::out_of_range("Index out of range");
  82.         }
  83.         return data[index];
  84.     }
  85.  
  86.     // Возвращает константную ссылку на элемент с индексом index
  87.     // Выбрасывает исключение std::out_of_range, если index >= size
  88.     Type& At(size_t index) {
  89.         if (index >= size_) {
  90.             throw std::out_of_range("Index out of range");
  91.         }
  92.         return data[index];
  93.     }
  94.  
  95.     // Возвращает константную ссылку на элемент с индексом index
  96.     // Выбрасывает исключение std::out_of_range, если index >= size
  97.     const Type& At(size_t index) const {
  98.         if (index >= size_) {
  99.             throw std::out_of_range("Index out of range");
  100.         }
  101.         return data[index];
  102.     }
  103.  
  104.     // Обнуляет размер массива, не изменяя его вместимость
  105.     void Clear() noexcept {
  106.         size_ = 0;
  107.     }
  108.  
  109.     // Изменяет размер массива.
  110.     // При увеличении размера новые элементы получают значение по умолчанию для типа Type
  111.     void Resize(size_t new_size) {
  112.          if (new_size > capacity_) {
  113.             ArrayPtr<Type> new_data(size_);
  114.             for (size_t i = 0; i < size_; ++i) {
  115.                 new_data[i] = data[i];
  116.             }
  117.             for (size_t i = size_; i < new_size; ++i) {
  118.                 new_data[i] = Type();  // Initialize new elements with default value
  119.             }
  120.             data.swap(new_data);
  121.             capacity_ = new_size;
  122.         }
  123.         size_ = new_size;
  124.     }
  125.  
  126.     // Возвращает итератор на начало массива
  127.     // Для пустого массива может быть равен (или не равен) nullptr
  128.     Iterator begin() noexcept {
  129.         return data.Get();
  130.     }
  131.  
  132.     // Возвращает итератор на элемент, следующий за последним
  133.     // Для пустого массива может быть равен (или не равен) nullptr
  134.     Iterator end() noexcept {
  135.         return data.Get() + size_;
  136.     }
  137.  
  138.     // Возвращает константный итератор на начало массива
  139.     // Для пустого массива может быть равен (или не равен) nullptr
  140.     ConstIterator begin() const noexcept {
  141.         return data.Get();
  142.     }
  143.  
  144.     // Возвращает итератор на элемент, следующий за последним
  145.     // Для пустого массива может быть равен (или не равен) nullptr
  146.     ConstIterator end() const noexcept {
  147.         return data.Get() + size_;
  148.     }
  149.  
  150.     // Возвращает константный итератор на начало массива
  151.     // Для пустого массива может быть равен (или не равен) nullptr
  152.     ConstIterator cbegin() const noexcept {
  153.         return begin();
  154.     }
  155.  
  156.     // Возвращает итератор на элемент, следующий за последним
  157.     // Для пустого массива может быть равен (или не равен) nullptr
  158.     ConstIterator cend() const noexcept {
  159.         return end();
  160.     }
  161. };
Advertisement
Add Comment
Please, Sign In to add comment