简单的vector--- 2

如何重载operator[]   及其相关细节

如何使用 const_cast<>(  )  和 static_cast<>( )

模板类 如何内部声明,外部定义友元函数

使用memset( )、memcpy_s( )

使用sizeof( )

禁用移动构造 和 移动赋值

  1 #pragma once
  2 #include <iostream>
  3 using std::ostream;
  4 using std::cout;
  5 using std::endl;
  6 
  7 template <class T>
  8 class vector
  9 {
 10 public:
 11     explicit vector(int size);
 12     vector(const vector<T>& v);
 13     vector(vector<T>&&) = delete;
 14     vector(int size, T vlaue);
 15     vector(T* es, int len);
 16     vector& operator=(const vector<T>& v);
 17     vector& operator=(vector<T>&&) = delete;
 18 
 19     int size() const;
 20     int capacity() const;
 21     void reserve(int min_capacity);
 22     void push_back(T e);
 23     void pop_back();
 24     void erase(int pos);
 25     void insert(T e, int pos);
 26 
 27     const T& operator[](int) const;
 28     T& operator[](int);
 29     template <class Ty>
 30     friend ostream& operator<<(ostream& os, const vector<Ty>& v);
 31 private:
 32     T* vec;
 33     int _size;
 34     int _capacity;
 35 };
 36 
 37 template <class T>
 38 inline ostream& operator<<(ostream& os, const vector<T>& v)
 39 {
 40     os << endl << "输出: " << endl;
 41     for (int i = 0; i < v._size; i++)
 42     {
 43         os << v.vec[i] << "  ";
 44     }
 45     return os;
 46 }
 47 
 48 template <class T>
 49 inline vector<T>::vector(int size) : _size(size)
 50 {
 51     _capacity = size + size / 3;
 52     this->vec = new T[_capacity];
 53     memset(this->vec, 0x00, sizeof(T) * _capacity);
 54 }
 55 
 56 template <class T>
 57 inline vector<T>::vector(int size, T vlaue)
 58 {
 59     this->_capacity = size + size / 3;
 60     this->_size = size;
 61     this->vec = new T[_capacity];
 62     for (int i = 0; i < _size; i++)
 63     {
 64         this->vec[i] = vlaue;
 65     }
 66 }
 67 
 68 template <class T>
 69 inline vector<T>::vector(T* es, int len)
 70 {
 71     this->_size = len;
 72     this->_capacity = len + len / 3;
 73     this->vec = new T[_capacity];
 74     memcpy_s(this->vec, len * sizeof(T), es, len * sizeof(T));
 75 }
 76 
 77 template <class T>
 78 inline vector<T>::vector(const vector& v)
 79 {
 80     this->_capacity = v._capacity;
 81     this->_size = v._size;
 82     this->vec = new T[_capacity];
 83     memcpy_s(this->vec, sizeof(T) * _capacity, v.vec, sizeof(T) * _capacity);
 84 }
 85 
 86 template <class T>
 87 inline int vector<T>::size() const
 88 {
 89     return this->_size;
 90 }
 91 
 92 template <class T>
 93 inline int vector<T>::capacity() const
 94 {
 95     return this->_capacity;
 96 }
 97 
 98 template <class T>
 99 inline vector<T>& vector<T>::operator=(const vector<T>& v)
100 {
101     if (this == &v)return *this;
102     if (this->vec != nullptr)delete[] this->vec;
103     this->_capacity = v._capacity;
104     this->_size = v._size;
105     this->vec = new T[_capacity];
106     memcpy_s(this->vec, _capacity * sizeof(T), v.vec, v._capacity * sizeof(T));
107     return *this;
108 }
109 
110 template <class T>
111 inline void vector<T>::reserve(const int min_capacity)
112 {
113     if (min_capacity < this->_capacity) return;
114     else
115     {
116         int* n_vec = new T[min_capacity];
117         for (int i = 0; i < _size; i++)
118         {
119             n_vec[i] = vec[i];
120         }
121         delete[] vec;
122         this->vec = n_vec;
123         this->_capacity = min_capacity;
124     }
125 }
126 
127 template <class T>
128 inline void vector<T>::push_back(T e)
129 {
130     if (this->_size >= this->_capacity)
131     {
132         this->reserve(this->_size + this->_size / 3);
133     }
134     this->vec[_size++] = e;
135 }
136 
137 template <class T>
138 inline void vector<T>::pop_back()
139 {
140     if (this->_size != 0)
141         this->_size -= 1;
142 }
143 
144 template <class T>
145 inline void vector<T>::erase(int pos)
146 {
147     if (pos < 0 || pos >= _size)return;
148     else
149     {
150         for (int i = pos; i < _size - 1; i++)
151         {
152             this->vec[i] = this->vec[i + 1];
153         }
154         _size -= 1;
155     }
156 }
157 
158 template <class T>
159 inline void vector<T>::insert(T e, int pos)
160 {
161     if (pos < 0 || pos > _size - 1)return;
162     if (this->_size >= this->_capacity)
163     {
164         this->reserve(this->_size + this->_size / 3);
165     }
166     for (int i = _size; i > pos; i++)
167     {
168         this->vec[i] = this->vec[i - 1];
169     }
170     this->vec[pos] = e;
171 }
172 
173 template <class T>
174 inline const T& vector<T>::operator[](int i) const
175 {
176     if (i < 0 || i >= this->_size)
177     {
178         cout << "下标 i=" << i << " 越界 退出";
179         exit(1);
180     };
181     return this->vec[i];
182 }
183 
184 template <class T>
185 T& vector<T>::operator[](int pos)
186 {
187     // 这个写法的意思是 将指针this 转成 const 型指针 再对其*解引 
188     //return const_cast<T&>((*static_cast<const vector<T>*>(this))[pos]);
189 
190     //这个是先对this 指针解引  再转成const 而且&直接引用该对象 
191     return const_cast<T&>(static_cast<const vector<T>&>(*this)[pos]);
192 
193     //这个写法不不可取;先对this指针 解引,再转成const时 并不是&,所以会重新创建一个新对象
194     //return const_cast<T&>(static_cast<const vector<T>>(*this)[pos]);
195 }

 

posted @ 2017-10-19 12:58  Lucky、Dog  阅读(208)  评论(0编辑  收藏  举报