Advertisement
chevengur

deq_imp

Feb 18th, 2025
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.76 KB | None | 0 0
  1. #pragma once
  2. #include <initializer_list>
  3. #include <iterator>
  4.  
  5. template <typename T>
  6. class deque{
  7. public:
  8.     using iterator = std::random_access_iterator_tag;
  9.  
  10.     // constructor default
  11.     deque(): ptr_deq_(nullptr), deq_start_(0), deq_end_(0), size_deq_(0)
  12.     , size_chunk_(0), chunk_start_(0), chunk_end_(0){}
  13.      
  14.     deque(const T& elem){
  15.         ptr_deq_ = new T*[BLOCK_SIZE](); // инициализируем  [0][0][0][0][0][0][0][0]
  16.                                                    //        |  |  |  |  |  |  |  |
  17.  
  18.         ptr_deq_[0] = new T[BLOCK_SIZE];        // инициализируем первый блок чанков 8.
  19.         ptr_deq_[0][0] = elem;     // первый элемент раверн elem
  20.  
  21.         deq_start_ = 0;
  22.         deq_end_ = 1;
  23.         size_deq_ = 1;
  24.         size_chunk_ = BLOCK_SIZE;
  25.         chunk_start_ = 0;
  26.         chunk_end_ = 1;
  27.     }
  28.  
  29.     deque(std::initializer_list<T> lst): size_deq_(lst.size())
  30.     , size_chunk_((size_deq_ + BLOCK_SIZE - 1) / BLOCK_SIZE)
  31.     , ptr_deq_(new T*[size_deq_])
  32.     , deq_start_(0)
  33.     , deq_end_(size_deq_)
  34.     {
  35.         for(size_t i = 0; i < size_chunk_; ++i){
  36.             ptr_deq_[i] = new T[BLOCK_SIZE]();
  37.         }
  38.  
  39.         size_t i = 0;
  40.         for(const auto& elem: lst){
  41.             ptr_deq_[i / BLOCK_SIZE][i % BLOCK_SIZE] = elem;
  42.             ++i;
  43.         }
  44.     }
  45.  
  46.     ~deque(){
  47.         for(size_t i = 0; i < size_deq_; ++i){
  48.             delete ptr_deq_[i];
  49.         }
  50.         delete[] ptr_deq_;
  51.     }
  52.  
  53.     // methods
  54.     void push_back(const T& elem);
  55.     void push_front(const T& elem);
  56.     void resize(const size_t sz);
  57.  
  58.     T& front() {
  59.         return ptr_deq_[deq_start_ / BLOCK_SIZE][deq_start_ % BLOCK_SIZE];
  60.     }
  61.  
  62.     const T& front() const {
  63.         return ptr_deq_[deq_start_ / BLOCK_SIZE][deq_start_ % BLOCK_SIZE];
  64.     }
  65.  
  66.     T& back(){
  67.         return ptr_deq_[(deq_end_-1) / BLOCK_SIZE][(deq_end_-1) % BLOCK_SIZE];
  68.     }
  69.  
  70.     const T& back() const{
  71.         return ptr_deq_[(deq_end_-1) / BLOCK_SIZE][(deq_end_-1) % BLOCK_SIZE];
  72.     }
  73.  
  74.     size_t size(){
  75.         return size_deq_;
  76.     }
  77.  
  78.  
  79. private:
  80.     static const size_t BLOCK_SIZE = 8;
  81.     // Указатель на массив элементов
  82.     T** ptr_deq_;           // * -> |||||
  83.                             // * -> |||||
  84.  
  85.  
  86.     size_t deq_start_;      // старт deque
  87.     size_t deq_end_;        // конец deque
  88.     size_t size_deq_;       // размер всего deque
  89.  
  90.    
  91.     size_t size_chunk_;     // размер чанка в deque
  92.     size_t chunk_start_;    // начало элементов в массиве * -> |... начало
  93.     size_t chunk_end_;      // конец элементов в массиве * -> ...| конец
  94. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement