Not a member of Pastebin yet?
                        Sign Up,
                        it unlocks many cool features!                    
                - #ifndef VECTOR_H
 - #define VECTOR_H
 - #include <iterator>
 - #include <cstddef>
 - #include <string>
 - #include <type_traits>
 - #include <utility>
 - #include <initializer_list>
 - template<typename T>
 - class vector
 - {
 - public:
 - typedef T value_type;
 - typedef value_type* iterator;
 - typedef const value_type* const_iterator;
 - typedef value_type& reference;
 - typedef const value_type& const_reference;
 - typedef std::reverse_iterator<iterator> reverse_iterator;
 - typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
 - typedef std::size_t size_type;
 - typedef std::ptrdiff_t difference_type;
 - explicit vector() : __base(nullptr), __size(0), __capacity(0) {}
 - explicit vector(size_type n) : __base(nullptr), __size(n), __capacity(__size << 1)
 - {
 - __base = new value_type[__capacity];
 - for(size_type __c = 0; __c != __size; ++__c)
 - __base[__c] = value_type{};
 - }
 - explicit vector(size_type n, const value_type& val) : __base(nullptr), __size(n), __capacity(__size << 1)
 - {
 - __base = new value_type[__capacity];
 - for(size_type __c = 0; __c != __size; ++__c)
 - __base[__c] = val;
 - }
 - vector(const vector& x) : __size(x.__size), __capacity(x.__capacity)
 - {
 - delete [] __base;
 - __base = new value_type[__capacity];
 - for(size_type __c = 0; __c != __size; ++__c)
 - __base[__c] = x.__base[__c];
 - }
 - vector(vector&& x) : __base(std::move(x.__base)), __size(std::move(x.__size)), __capacity(std::move(x.__capacity))
 - {
 - x.__base = nullptr;
 - x.__size = 0;
 - x.__capacity = 0;
 - }
 - vector(std::initializer_list<value_type> il) : __size(il.size()), __capacity(__size << 1)
 - {
 - delete [] __base;
 - __base = new value_type[__capacity];
 - typename std::initializer_list<value_type>::iterator itr = il.begin();
 - typename std::initializer_list<value_type>::iterator end = il.end();
 - for(size_type __c = 0; __c != __size && itr != end; ++__c, ++itr)
 - __base[__c] = *itr;
 - }
 - ~vector()
 - {
 - delete [] __base;
 - __size = 0;
 - __capacity = 0;
 - }
 - vector& operator=(const vector& x)
 - {
 - delete [] __base;
 - __base = new value_type[__capacity];
 - __size = x.__size;
 - __capacity = x.__capacity;
 - for(size_type __c = 0; __c != __size; ++__c)
 - __base[__c] = x.__base[__c];
 - return *this;
 - }
 - vector& operator=(vector&& x)
 - {
 - __base = std::move(x.__base);
 - __size = std::move(x.__size);
 - __capacity = std::move(x.__capacity);
 - x.__base = nullptr;
 - x.__size = 0;
 - x.__capacity = 0;
 - return *this;
 - }
 - vector& operator=(std::initializer_list<value_type> il)
 - {
 - delete [] __base;
 - __base = new value_type[__capacity];
 - __size = il.size();
 - __capacity = (__size << 1);
 - typename std::initializer_list<value_type>::iterator itr = il.begin();
 - typename std::initializer_list<value_type>::iterator end = il.end();
 - for(size_type __c = 0; __c != __size && itr != end; ++__c, ++itr)
 - __base[__c] = *itr;
 - return *this;
 - }
 - iterator begin() noexcept { return iterator(std::addressof(__base[0])); }
 - const_iterator begin() const noexcept { return const_iterator(std::addressof(__base[0])); }
 - iterator end() noexcept { return iterator(std::addressof(__base[__size])); }
 - const_iterator end() const noexcept { return const_iterator(std::addressof(__base[__size])); }
 - reverse_iterator rbegin() noexcept { return reverse_iterator(std::addressof(__base[__size])); }
 - const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(std::addressof(__base[__size])); }
 - reverse_iterator rend() noexcept { return reverse_iterator(std::addressof(__base[0])); }
 - const_reverse_iterator rend() const noexcept { return const_reverse_iterator(std::addressof(__base[0])); }
 - const_iterator cbegin() const noexcept { return const_iterator(std::addressof(__base[0])); }
 - const_iterator cend() const noexcept { return const_iterator(std::addressof(__base[__size])); }
 - const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(std::addressof(__base[__size])); }
 - const_reverse_iterator crend() const noexcept { return const_reverse_iterator(std::addressof(__base[0])); }
 - size_type size() const noexcept { return __size; }
 - size_type max_size() const noexcept {
 - difference_type __PTRDIFF_T_MAX__ = 1;
 - __PTRDIFF_T_MAX__ <<= ((sizeof(difference_type) * 8) - 1);
 - return __PTRDIFF_T_MAX__ - 1;
 - }
 - size_type capacity() const noexcept { return __capacity; }
 - void resize(size_type n)
 - {
 - if(n < __size)
 - {
 - __size = n;
 - std::destroy(std::addressof(__base[n]), std::addressof(__base[__size]));
 - }
 - else if(n == __size)
 - return;
 - else
 - {
 - if(__capacity < n)
 - {
 - __capacity = n;
 - value_type* __tmp_base = new value_type[__capacity];
 - for(size_type __c = 0; __c != __size; ++__c)
 - __tmp_base[__c] = __base[__c];
 - delete [] __base;
 - __base = __tmp_base;
 - }
 - for(size_type __c = __size; __c != n; ++__c)
 - __base[__c] = value_type{};
 - __size = n;
 - }
 - }
 - void resize(size_type n, const value_type& val)
 - {
 - if(n < __size)
 - {
 - __size = n;
 - std::destroy(std::addressof(__base[n]), std::addressof(__base[__size]));
 - }
 - else if(n == __size)
 - return;
 - else
 - {
 - if(n > __capacity)
 - {
 - __capacity = n;
 - value_type* __tmp_base = new value_type[__capacity];
 - for(size_type __c = 0; __c != __size; ++__c)
 - __tmp_base[__c] = __base[__c];
 - delete [] __base;
 - __base = __tmp_base;
 - }
 - for(size_type __c = __size; __c != n; ++__c)
 - __base[__c] = val;
 - __size = n;
 - }
 - }
 - void reserve(size_type n)
 - {
 - if(n > __capacity)
 - {
 - __capacity = n << 1;
 - value_type* __tmp_base = new value_type[__capacity];
 - for(size_type __c = 0; __c != __size; ++__c)
 - __tmp_base[__c] = __base[__c];
 - delete [] __base;
 - __base = __tmp_base;
 - }
 - }
 - void shrink_to_fit()
 - {
 - if(__capacity != __size)
 - {
 - __capacity = __size;
 - std::destroy(std::addressof(__base[__size]), std::addressof(__base[__capacity]));
 - }
 - }
 - bool empty() const noexcept { return __size == 0 && begin() == end(); }
 - reference operator[](size_type n) { return __base[n]; }
 - const_reference operator[](size_type n) const { return __base[n]; }
 - reference at(size_type n)
 - {
 - if(n < __size)
 - return __base[n];
 - else
 - {
 - std::string __prelouge = "vector::_M_range_check: __n (which is ";
 - std::string __inlouge = ") >= this->size() (which is ";
 - std::string __prolouge = ")";
 - std::string msg = __prelouge + std::to_string(n) + __inlouge + std::to_string(__size) + __prolouge;
 - throw std::out_of_range(msg);
 - }
 - }
 - const_reference at(size_type n) const
 - {
 - if(n < __size)
 - return __base[n];
 - else
 - {
 - std::string __prelouge = "vector::_M_range_check: __n (which is ";
 - std::string __inlouge = ") >= this->size() (which is ";
 - std::string __prolouge = ")";
 - std::string msg = __prelouge + std::to_string(n) + __inlouge + std::to_string(__size) + __prolouge;
 - throw std::out_of_range(msg);
 - }
 - }
 - reference front() {
 - if(empty())
 - throw std::out_of_range("vector::_M_range_check: container empty : this->size() (which is 0)");
 - else
 - return reference(__base[0]);
 - }
 - const_reference front() const
 - {
 - if(empty())
 - throw std::out_of_range("vector::_M_range_check: container empty : this->size() (which is 0)");
 - else
 - return const_reference(__base[0]);
 - }
 - reference back()
 - {
 - if(empty())
 - throw std::out_of_range("vector::_M_range_check: container empty : this->size() (which is 0)");
 - else
 - return reference(__base[__size - 1]);
 - }
 - const_reference back() const
 - {
 - if(empty())
 - throw std::out_of_range("vector::_M_range_check: container empty : this->size() (which is 0)");
 - else
 - return reference(__base[__size - 1]);
 - }
 - value_type* data() { return __base; }
 - const value_type* data() const { return __base; }
 - void assign(size_type n, const value_type& val)
 - {
 - delete [] __base;
 - __base = new value_type[__capacity];
 - __size = n;
 - __capacity = (__size << 1);
 - for(size_type __c = 0; __c != __size; ++__c)
 - __base[__c] = val;
 - }
 - void assign(std::initializer_list<value_type> il)
 - {
 - delete [] __base;
 - __base = new value_type[__capacity];
 - __size = il.size();
 - __capacity = (__size << 1);
 - typename std::initializer_list<value_type>::iterator itr = il.begin();
 - typename std::initializer_list<value_type>::iterator end = il.end();
 - for(size_type __c = 0; __c != __size && itr != end; ++__c, ++itr)
 - __base[__c] = *itr;
 - }
 - void push_back(const value_type& val)
 - {
 - if(__size == __capacity)
 - {
 - if(__size == 0) __capacity = 1;
 - else __capacity = (__size << 1);
 - value_type* __tmp_base = new value_type[__capacity];
 - for(size_type __c = 0; __c != __size; ++__c)
 - __tmp_base[__c] = __base[__c];
 - delete [] __base;
 - __base = __tmp_base;
 - }
 - __base[__size] = val;
 - ++__size;
 - }
 - void push_back(value_type&& val)
 - {
 - if(__size == __capacity)
 - {
 - if(__size == 0) __capacity = 1;
 - else __capacity = (__size << 1);
 - value_type* __tmp_base = new value_type[__capacity];
 - for(size_type __c = 0; __c != __size; ++__c)
 - __tmp_base[__c] = __base[__c];
 - delete [] __base;
 - __base = __tmp_base;
 - }
 - __base[__size] = std::move(val);
 - ++__size;
 - }
 - void pop_back()
 - {
 - if(empty())
 - throw std::out_of_range("vector::_M_range_check: container empty : this->size() (which is 0)");
 - else
 - {
 - std::destroy(std::addressof(__base[__size - 1]), std::addressof(__base[__size]));
 - --__size;
 - }
 - }
 - iterator insert(const_iterator position, const value_type& val)
 - {
 - size_type __pos = position - begin();
 - if(__size == __capacity)
 - {
 - if(__size == 0) __capacity = 1;
 - else __capacity = (__size << 1);
 - value_type* __tmp_base = new value_type[__capacity];
 - for(size_type __c = 0; __c != __size; ++__c)
 - __tmp_base[__c] = __base[__c];
 - delete [] __base;
 - __base = __tmp_base;
 - }
 - for(size_type __c = __size; __c != __pos; --__c)
 - __base[__c] = __base[__c - 1];
 - __base[__pos] = val;
 - ++__size;
 - return iterator(std::addressof(__base[__pos]));
 - }
 - iterator insert(const_iterator position, value_type&& val)
 - {
 - size_type __pos = position - begin();
 - if(__size == __capacity)
 - {
 - if(__size == 0) __capacity = 1;
 - else __capacity = (__size << 1);
 - value_type* __tmp_base = new value_type[__capacity];
 - for(size_type __c = 0; __c != __size; ++__c)
 - __tmp_base[__c] = __base[__c];
 - delete [] __base;
 - __base = __tmp_base;
 - }
 - for(size_type __c = __size; __c != __pos; --__c)
 - __base[__c] = __base[__c - 1];
 - __base[__pos] = std::move(val);
 - ++__size;
 - return iterator(std::addressof(__base[__pos]));
 - }
 - iterator insert(const_iterator position, size_type n, const value_type& val)
 - {
 - size_type __pos = position - begin();
 - if(__size + n > __capacity)
 - {
 - if(__size == 0) __capacity = (n << 1);
 - else __capacity = ((__size + n) << 1);
 - value_type* __tmp_base = new value_type[__capacity];
 - for(size_type __c = 0; __c != __size; ++__c)
 - __tmp_base[__c] = __base[__c];
 - delete [] __base;
 - __base = __tmp_base;
 - }
 - for(size_type __c = __size + n - 1; __c != __pos + n - 1; --__c)
 - __base[__c] = __base[__c - n];
 - for(size_type __c = __pos; __c != (__pos + n); ++__c)
 - __base[__c] = val;
 - __size += n;
 - return iterator(std::addressof(__base[__pos]));
 - }
 - iterator insert(const_iterator position, std::initializer_list<value_type> il)
 - {
 - size_type __pos = position - begin();
 - size_type n = il.size();
 - if(__size + n > __capacity)
 - {
 - if(__size == 0) __capacity = (n << 1);
 - else __capacity = ((__size + n) << 1);
 - value_type* __tmp_base = new value_type[__capacity];
 - for(size_type __c = 0; __c != __size; ++__c)
 - __tmp_base[__c] = __base[__c];
 - delete [] __base;
 - __base = __tmp_base;
 - }
 - for(size_type __c = __size + n - 1; __c != __pos + n - 1; --__c)
 - __base[__c] = __base[__c - n];
 - typename std::initializer_list<value_type>::iterator itr = il.begin();
 - typename std::initializer_list<value_type>::iterator end = il.end();
 - for(size_type __c = __pos; __c != (__pos + n) && itr != end; ++__c, ++itr)
 - __base[__c] = *itr;
 - __size += n;
 - return iterator(std::addressof(__base[__pos]));
 - }
 - template<class InputIterator>
 - typename std::enable_if<std::is_pointer<InputIterator>::value, iterator>::type
 - insert(const_iterator position, InputIterator first, InputIterator last)
 - {
 - size_type __pos = position - begin();
 - size_type n = last - first;
 - if(__size + n > __capacity)
 - {
 - if(__size == 0) __capacity = (n << 1);
 - else __capacity = ((__size + n) << 1);
 - value_type* __tmp_base = new value_type[__capacity];
 - for(size_type __c = 0; __c != __size; ++__c)
 - __tmp_base[__c] = __base[__c];
 - delete [] __base;
 - __base = __tmp_base;
 - }
 - for(size_type __c = __size + n - 1; __c != __pos + n - 1; --__c)
 - __base[__c] = __base[__c - n];
 - iterator itr = first;
 - for(size_type __c = __pos; __c != (__pos + n) && itr != last; ++__c, ++itr)
 - __base[__c] = *itr;
 - __size += n;
 - return iterator(std::addressof(__base[__pos]));
 - }
 - iterator erase(const_iterator position)
 - {
 - if(empty())
 - throw std::out_of_range("vector::_M_range_check: container empty : this->size() (which is 0)");
 - else
 - {
 - size_type __pos = position - begin();
 - for(size_type __c = __pos; __c != __size - 1; ++__c)
 - __base[__c] = __base[__c + 1];
 - --__size;
 - return iterator(std::addressof(__base[__pos]));
 - }
 - }
 - iterator erase(const_iterator first, const_iterator last)
 - {
 - if(empty())
 - throw std::out_of_range("vector::_M_range_check: container empty : this->size() (which is 0)");
 - else
 - {
 - size_type n = last - first;
 - size_type __pos = first - begin();
 - for(size_type __c = __pos; __c != __size - n; ++__c)
 - __base[__c] = __base[__c + n];
 - __size -= n;
 - return iterator(std::addressof(__base[__pos]));
 - }
 - }
 - void swap(vector& x)
 - {
 - if(*this == x) return;
 - std::swap(*this, x);
 - }
 - void clear() noexcept
 - {
 - if(__size == 0) return;
 - delete [] __base;
 - __base = new value_type[__capacity];
 - __size = 0;
 - }
 - bool operator==(const vector& rhs)
 - {
 - if(__size != rhs.__size) return false;
 - for(size_type __c = 0; __c != __size; ++__c)
 - if(__base[__c] != rhs.__base[__c])
 - return false;
 - return true;
 - }
 - bool operator!=(const vector& rhs)
 - {
 - if(__size != rhs.__size) return true;
 - for(size_type __c = 0; __c != __size; ++__c)
 - if(__base[__c] != rhs.__base[__c])
 - return true;
 - return false;
 - }
 - bool operator<(const vector& rhs)
 - {
 - return std::lexicographical_compare(this->begin(), this->end(), rhs.begin(), rhs.end());
 - }
 - bool operator<=(const vector& rhs)
 - {
 - return !(std::lexicographical_compare(rhs.begin(), rhs.end(), this->begin(), this->end()));
 - }
 - bool operator>(const vector& rhs)
 - {
 - return std::lexicographical_compare(rhs.begin(), rhs.end(), this->begin(), this->end());
 - }
 - bool operator>=(const vector& rhs)
 - {
 - return !(std::lexicographical_compare(this->begin(), this->end(), rhs.begin(), rhs.end()));
 - }
 - private:
 - value_type* __base;
 - size_type __size;
 - size_type __capacity;
 - };
 - #endif
 
Advertisement
 
                    Add Comment                
                
                        Please, Sign In to add comment