shizaero

Untitled

Aug 18th, 2023
886
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.67 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.         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) noexcept{
  72.         return data[index];
  73.     }
  74.  
  75.     // Возвращает константную ссылку на элемент с индексом index
  76.     const Type& operator[](size_t index) const  noexcept{
  77.         return data[index];
  78.     }
  79.  
  80.     // Возвращает константную ссылку на элемент с индексом index
  81.     // Выбрасывает исключение std::out_of_range, если index >= size
  82.     Type& At(size_t index) {
  83.         if (index >= size_) {
  84.             throw std::out_of_range("Index out of range");
  85.         }
  86.         return data[index];
  87.     }
  88.  
  89.     // Возвращает константную ссылку на элемент с индексом index
  90.     // Выбрасывает исключение std::out_of_range, если index >= size
  91.     const Type& At(size_t index) const {
  92.         if (index >= size_) {
  93.             throw std::out_of_range("Index out of range");
  94.         }
  95.         return data[index];
  96.     }
  97.  
  98.     // Обнуляет размер массива, не изменяя его вместимость
  99.     void Clear() noexcept {
  100.         size_ = 0;
  101.     }
  102.  
  103.     // Изменяет размер массива.
  104.     // При увеличении размера новые элементы получают значение по умолчанию для типа Type
  105.     void Resize(size_t new_size) {
  106.          if (new_size > capacity_) {
  107.             ArrayPtr<Type> new_data(new_size);
  108.             for (size_t i = 0; i < size_; ++i) {
  109.                 new_data[i] = data[i];
  110.             }
  111.             for (size_t i = size_; i < new_size; ++i) {
  112.                 new_data[i] = Type();  // Initialize new elements with default value
  113.             }
  114.             data.swap(new_data);
  115.             capacity_ = new_size;
  116.         }
  117.         if(new_size < size_) std::fill(data.Get() + new_size, data.Get() + size_, 0);
  118.         size_ = new_size;
  119.     }
  120.  
  121.     // Возвращает итератор на начало массива
  122.     // Для пустого массива может быть равен (или не равен) nullptr
  123.     Iterator begin() noexcept {
  124.         return data.Get();
  125.     }
  126.  
  127.     // Возвращает итератор на элемент, следующий за последним
  128.     // Для пустого массива может быть равен (или не равен) nullptr
  129.     Iterator end() noexcept {
  130.         return data.Get() + size_;
  131.     }
  132.  
  133.     // Возвращает константный итератор на начало массива
  134.     // Для пустого массива может быть равен (или не равен) nullptr
  135.     ConstIterator begin() const noexcept {
  136.         return data.Get();
  137.     }
  138.  
  139.     // Возвращает итератор на элемент, следующий за последним
  140.     // Для пустого массива может быть равен (или не равен) nullptr
  141.     ConstIterator end() const noexcept {
  142.         return data.Get() + size_;
  143.     }
  144.  
  145.     // Возвращает константный итератор на начало массива
  146.     // Для пустого массива может быть равен (или не равен) nullptr
  147.     ConstIterator cbegin() const noexcept {
  148.         return begin();
  149.     }
  150.  
  151.     // Возвращает итератор на элемент, следующий за последним
  152.     // Для пустого массива может быть равен (или не равен) nullptr
  153.     ConstIterator cend() const noexcept {
  154.         return end();
  155.     }
  156. };
Advertisement
Add Comment
Please, Sign In to add comment