Punchcard

Untitled

Sep 6th, 2023 (edited)
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.54 KB | Source Code | 0 0
  1. #include <algorithm>
  2. #include <cassert>
  3. #include <stdexcept>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. // Используйте эту заготовку PtrVector или замените её на свою реализацию
  9. template <typename T>
  10. class PtrVector {
  11. public:
  12.     PtrVector() = default;
  13.  
  14.     // Создаёт вектор указателей на копии объектов из other
  15.     PtrVector(const PtrVector& other) {
  16.         // Резервируем место в vector-е для хранения нужного количества элементов
  17.         // Благодаря этому при push_back не будет выбрасываться исключение
  18.         items_.reserve(other.items_.size());
  19.  
  20.         try {
  21.             for (auto p : other.items_) {
  22.                 // Копируем объект, если указатель на него ненулевой
  23.                 auto p_copy = p ? new T(*p) : nullptr;  // new может выбросить исключение
  24.  
  25.                 // Не выбросит исключение, т. к. в vector память уже зарезервирована
  26.                 items_.push_back(p_copy);
  27.             }
  28.         } catch (...) {
  29.             // удаляем элементы в векторе и перевыбрасываем пойманное исключение
  30.             DeleteItems();
  31.             throw;
  32.         }
  33.     }
  34.  
  35.     // Деструктор удаляет объекты в куче, на которые ссылаются указатели,
  36.     // в векторе items_
  37.     ~PtrVector() {
  38.         DeleteItems();
  39.     }
  40.  
  41.    
  42.    
  43.     PtrVector& operator=(const PtrVector& rhs) {
  44.         // При присваивании PtrVector самому себе произойдёт удаление не только
  45.         // своих элементов, но и элементов rhs.
  46.         if (this != &rhs) {
  47.             auto dummy(rhs.GetItems());
  48.             items_.swap(dummy);
  49.         }
  50.         return *this;
  51.     }  
  52.    
  53.     void swap(vector<T*> other) noexcept;
  54.  
  55.     // Возвращает ссылку на вектор указателей
  56.     vector<T*>& GetItems() noexcept {
  57.         return items_;
  58.     }
  59.  
  60.     // Возвращает константную ссылку на вектор указателей
  61.     vector<T*> const& GetItems() const noexcept {
  62.         return items_;
  63.     }
  64.  
  65. private:
  66.     void DeleteItems() noexcept {
  67.         for (auto p : items_) {
  68.             delete p;
  69.         }
  70.     }
  71.  
  72.     vector<T*> items_;
  73. };
Advertisement
Add Comment
Please, Sign In to add comment