STL之vector的学习2(代码实现)(修改版1)

《数据结构与算法分析》的代码!!!!

PS:因为书本没有给clear、erase函数的实现,我也只好自己弄了个clear函数,不过erase函数不知道怎样才能弄好,迟点在改善。

vector的实质也是数组,但是它的容量能动态变大,避免了溢出!!!
PS:加了两条习题的内容。
3.7 修改Vector类,添加索引时的边界检测功能。
3.8 给Vector类添加insert和erase。
 
还有一题未完成,是将迭代器定义为一个类,来提供严格的迭代器检验。这条题目才是真正的考验·····迟点准备做·····
 
  1 #include<iostream>
  2 using namespace std;
  3 
  4 template <typename Object>
  5 class Vector
  6 {
  7 public:
  8     enum { SPARE_CAPACITY = 16 };                       //设置vector没有元素的时候容量为多少。
  9     explicit Vector( int initSize = 0 ) : theSize( initSize ), theCapacity ( initSize + SPARE_CAPACITY )
 10     {
 11         objects = new Object[ theCapacity ];
 12     }                                                   //构造函数。
 13     Vector ( const Vector & rhs) : objects ( NULL )
 14     {
 15         operator=( rhs );
 16     }                                                   //复制构造函数。(实质为调用=操作符重载)。
 17     ~Vector( )
 18     {
 19         delete [ ] objects;
 20     }                                                   //析构函数。
 21 
 22     const Vector &operator= ( const Vector & rhs)
 23     {
 24         if( this != &rhs)
 25         {
 26             delete [ ] objects;
 27             theSize = rhs.size( );
 28             theCapacity = rhs.capacity( );
 29 
 30             objects = new Object [ capacity( ) ];
 31             for(int k = 0; k < size( ); k++)
 32                 objects[ k ] = rhs.objects[ k ];
 33         }
 34         return *this;
 35     }                                                   /*=操作符重载,注意要先判断两个对象是否相等。这个非常重要。自我复制常常被错误的应用
 36                                                           赋值总是用新值取代目标对象的旧值。如果原对象和目标对象是同一个,而我们又奉行“先释放旧值
 37                                                           再复制”的规则,那么可能还没实现复制之前就把原对象销毁。*/
 38 
 39     void resize( int newSize )
 40     {
 41         if( newSize > theCapacity )
 42             reserve( newSize * 2 + 1 );
 43         theSize = newSize;
 44     }                                                   //重新设置vector的大小(与容量比较,因为只有大于容量,容量才要变得更大)。
 45 
 46     void reserve( int newCapacity )
 47     {
 48         if( newCapacity < theCapacity )
 49             return;
 50 
 51         Object *oldArry = objects;
 52 
 53         objects = new Object[ newCapacity ];
 54         for( int k = 0; k < theSize; ++k)
 55             objects[ k ] = oldArry [ k ];
 56         theCapacity = newCapacity;
 57         delete [ ] oldArry;
 58     }                                                    //重新设置vector的容量。
 59 
 60     Object & operator[] ( int index )
 61     {
 62         if( index >= 0 && index < size( ) )
 63             return objects[ index ];
 64         else
 65             cerr << "你要查找的下标超出边界!" << endl;
 66     }
 67     const Object & operator[] ( int index ) const
 68     {
 69         if( index >= 0 && index < size( ) )
 70             return objects[ index ];
 71         else
 72             cerr << "你要查找的下标超出边界!" << endl;
 73     }                                                    //[]操作符的重载。
 74 
 75     bool empty( ) const
 76     {
 77         return size( ) == 0;
 78     }                                                   //判断是否没有元素。
 79     int size( ) const
 80     {
 81         return theSize;
 82     }                                                   //返回元素的数目。
 83     int capacity( ) const
 84     {
 85         return theCapacity;
 86     }                                                   //返回容量的大小。
 87 
 88     void push_back( const Object & x )
 89     {
 90         if( theSize == theCapacity )
 91             reserve( 2 * theCapacity + 1 );
 92         objects[ theSize++ ] = x;
 93     }                                                   //push_back的定义,后插入。
 94 
 95 
 96     void pop_back( )
 97     {
 98         theSize--;
 99     }
100     //删除最后一个元素。
101     void clear( )
102     {
103         delete [ ] objects;
104         theSize = 0;
105     }                                                   //删除所有元素
106 
107     const Object & back ( ) const
108     {
109         return objects[ theSize - 1 ];
110     }                                                   //返回最后一个元素。
111 
112     typedef Object * iterator;
113     typedef const Object * const_iterator;              //迭代器!!!
114 
115     iterator begin( )
116     {
117         return &objects[ 0 ];
118     }
119     const_iterator begin( ) const
120     {
121         return &objects[ 0 ];
122     }
123     iterator end( )
124     {
125         return &objects[ size( ) ];
126     }
127     const_iterator end( ) const
128     {
129         return &objects[ size( ) ];
130     }
131     //begin和end迭代器。
132 
133     iterator insert( iterator p, const Object & x )
134     {
135         int i;
136         Object * oldArry = objects;
137         theSize++;
138         if( theCapacity <= theSize )
139         {
140             theCapacity = 2 * theSize + 1;
141         }
142 
143         objects = new Object[ theCapacity ];
144 
145         for( i = 0; i < size( ); ++i )
146         {
147             if( oldArry[ i ] == *p )
148             {
149                 break;
150             }
151             objects[ i ] = oldArry[ i ];
152         }
153 
154         objects[ i ] = x;
155 
156         for( int j = i + 1; j < size( ); ++j )
157         {
158             objects[ j ] = oldArry[ j -1 ];
159         }
160 
161         delete [ ] oldArry;
162         return  & objects[ i ];
163     }
164                                                         //插入函数。在迭代器p,前插入值为x的新元素。
165     iterator erase( iterator p )
166     {
167         int i;
168         for( i = 0; i < size(); ++i )
169         {
170             if( objects[ i ] == *p )
171             break;
172         }
173 
174         for(int k = i; k < size() - 1; ++k )
175         {
176             objects[ k ] = objects[ k + 1 ];
177         }
178 
179         theSize--;
180         return & objects[ i ];
181     }
182                                                         //删除函数。删除迭代器p指向的元素,返回被删除元素后面的元素。
183 private:
184     int theSize;                                        //元素的数目
185     int theCapacity;                                    //容量的大小
186     Object * objects;                                   //对象的指针。数
187 };
188 
189 int main( )
190 {
191     Vector<int> v1;
192     int newsize, newcapacity;
193     if( v1.empty() )
194         cout << "vector里面没有元素!" << endl;
195     else
196         cout << "vector里面有元素!" << endl;
197 
198     int n, m;
199     cout << "输入你想输入元素的数目!" << endl;
200     cout << "可以尝试一下n大于16。(因为设置了vector的默认容量为16)(大于vector的最大容量时,vector的最大容量会自动变大!)" << endl;
201     cin >> n;
202         for(int i = 0; i < n; ++i)
203     {
204         cin >> m;
205         v1.push_back( m );
206         cout << "vector的size(里面有多少的元素):" << endl;
207         cout << v1.size() << endl;
208         cout << "vector的实际大小(最多能装多少元素):" << endl;
209         cout << v1.capacity() << endl;
210     }
211     cout << endl;
212 
213     cout << "以下通过对迭代器解引用输出迭代器所指向的值!" << endl;
214     for(Vector<int>::iterator itr = v1.begin(); itr != v1.end(); ++itr)
215         cout << *itr << " " ;
216     cout << endl;
217     cout << "重新设置vector的大小,输入你想要vector的大小:" << endl;
218     cin >> newsize;
219     v1.resize( newsize );
220     cout << "vector的size(里面有多少的元素):" << endl;
221     cout << v1.size() << endl;
222     cout << "vector的实际大小(最多能装多少元素):" << endl;
223     cout << v1.capacity() << endl;
224     cout << "重新设置vector的容量大小,输入你想要vector的容量:" << endl;
225     cin >> newcapacity;
226     v1.reserve(newcapacity);
227     cout << "vector的size(里面有多少的元素):" << endl;
228     cout << v1.size() << endl;
229     cout << "vector的实际大小(最多能装多少元素):" << endl;
230     cout << v1.capacity() << endl;
231     cout << "判断vector是否没有元素(不是容量为0)" << endl;
232     if( v1.empty() )
233         cout << "vector里面没有元素!" << endl;
234     else
235         cout << "vector里面有元素!" << endl;
236 
237     cout << "以下调用insert函数!" << endl;
238     int pos1;
239     cout << "输入你想在哪一个位置的迭代器前插入元素!" << endl;
240     cout << "注意不能大于或等于v1的元素数目:"  << v1.size() << endl;
241     cin >> pos1;
242     Vector<int>::iterator itr1 = v1.begin() + pos1;
243     int in;
244     cout << "输入你想插入的元素的值!" << endl;
245     cin >> in;
246     v1.insert( itr1, in );
247     cout << "v1的元素的数目!" << endl;
248     cout << v1.size() << endl;
249     for(Vector<int>::iterator itr = v1.begin(); itr != v1.end(); ++itr)
250         cout << *itr << " ";
251     cout << endl;
252 
253     cout << "以下为调用erase函数的例子" << endl;
254     cout << "输入你想删除的元素的位置" << endl;
255     int pos2;
256     cin >> pos2;
257     Vector<int>::iterator itr2 = v1.begin() + pos2;
258     v1.erase( itr2 );
259     for(int i = 0; i < v1.size(); ++i)
260     cout << v1[i] << " ";
261     cout << endl;
262 
263     cout << "以下为调用复制构造函数!" << endl;
264     Vector<int> v2(v1);
265     for(Vector<int>::iterator itr= v2.begin(); itr != v2.end(); ++itr)
266         cout << *itr << " " ;
267     cout << endl;
268 
269     cout << "以下调用=操作符的重载" << endl;
270     Vector<int> v3 = v1;
271     for(Vector<int>::iterator itr= v3.begin(); itr != v3.end(); ++itr)
272         cout << *itr << " " ;
273     cout << endl;
274 
275     cout << "以下调用clear函数!" << endl;
276     v1.clear();
277     if( v1.empty() )
278         cout << "vector里面没有元素!" << endl;
279     else
280         cout << "vector里面有元素!" << endl;
281     return 0;
282 }

 

posted @ 2012-09-11 13:12  alan_forever  阅读(360)  评论(0编辑  收藏  举报