21class delayed_delete_vector
23 using store_type = std::vector<T, Allocator>;
25 std::size_t m_front_offset = 0;
27 typedef typename store_type::value_type value_type;
28 typedef typename store_type::size_type size_type;
29 typedef typename store_type::difference_type difference_type;
30 typedef typename store_type::reference reference;
31 typedef typename store_type::const_reference const_reference;
32 typedef typename store_type::pointer pointer;
33 typedef typename store_type::const_pointer const_pointer;
34 typedef typename store_type::iterator iterator;
35 typedef typename store_type::reverse_iterator reverse_iterator;
36 typedef typename store_type::const_iterator const_iterator;
37 typedef typename store_type::const_reverse_iterator const_reverse_iterator;
39 delayed_delete_vector()
noexcept(std::is_nothrow_default_constructible_v<store_type>) : m_vec()
42 delayed_delete_vector(
size_t n,
const T& val) : m_vec(n, val)
45 delayed_delete_vector(
size_t n) : m_vec(n)
48 template<
typename InputIt>
49 delayed_delete_vector(InputIt first, InputIt last) : m_vec(first, last)
52 iterator begin()
noexcept
54 return m_vec.begin() + m_front_offset;
57 iterator end()
noexcept
62 const_iterator begin()
const noexcept
64 return m_vec.begin() + m_front_offset;
67 const_iterator end()
const noexcept
72 reverse_iterator rbegin()
noexcept
74 return m_vec.rbegin();
77 const_reverse_iterator rbegin()
const noexcept
79 return m_vec.rbegin();
82 reverse_iterator rend()
noexcept
84 return m_vec.rend() - m_front_offset;
87 const_reverse_iterator rend()
const noexcept
89 return m_vec.rend() - m_front_offset;
92 reference operator[](size_type pos)
94 return m_vec[pos + m_front_offset];
97 const_reference operator[](size_type pos)
const
99 return m_vec[pos + m_front_offset];
102 reference at(size_type pos)
104 return m_vec.at(pos + m_front_offset);
107 const_reference at(size_type pos)
const
109 return m_vec.at(pos + m_front_offset);
112 void push_back(
const T& value)
114 m_vec.push_back(value);
117 void push_back(T&& value)
119 m_vec.push_back(std::move(value));
122 void swap(delayed_delete_vector& other)
noexcept(std::is_nothrow_swappable_v<store_type>)
124 m_vec.swap(other.m_vec);
127 template<
typename... Args>
128 void emplace_back(Args&&... args)
130 m_vec.emplace_back(std::forward<Args>(args)...);
133 iterator insert(iterator pos,
const T& value)
135 return m_vec.insert(pos, value);
138 iterator insert(const_iterator pos, T&& value)
140 return m_vec.insert(pos, std::move(value));
143 template<
typename InputIt>
144 void insert(iterator pos, InputIt first, InputIt last)
146 m_vec.insert(pos, first, last);
149 void resize(size_type count)
155 iterator erase(iterator pos)
157 if (pos == m_vec.begin() + m_front_offset)
160 return m_vec.begin() + m_front_offset;
163 return m_vec.erase(pos);
166 iterator erase(iterator first, iterator last)
168 return m_vec.erase(first, last);
171 size_type capacity()
const noexcept
173 return m_vec.capacity();
179 m_vec.shrink_to_fit();
182 void reserve(size_type new_cap)
185 m_vec.reserve(new_cap);
188 size_type size()
const
190 return m_vec.size() - m_front_offset;
193 template<
typename InputIt>
194 void assign(InputIt first, InputIt last)
197 m_vec.assign(first, last);
202 return m_vec.data() + m_front_offset;
205 const T* data()
const
207 return m_vec.data() + m_front_offset;
213 m_vec.erase(m_vec.begin(), m_vec.begin() + m_front_offset);