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 }

 

你可能感兴趣的:(vector)