CPP(九):vector与迭代器的实现

来源:互联网 发布:最新网络新鲜事 编辑:程序博客网 时间:2024/04/28 22:59

vector的实现并不难,不过vector在实现的同时要需要实现一个对应的迭代器。

下面是实现源码,从测试函数中可以看出,其外部行为和STL的vector相同。

#include <iostream>using namespace std;template <typename TYPE>class vector{private:TYPE *data;size_t used_bytes;size_t total_bytes;void resize(size_t least_size){// decide new size!if (total_bytes == 0) total_bytes = 8;while (total_bytes < least_size){total_bytes *= 2;}// allocate memory and copy dataTYPE *old_data = data;data = new TYPE[total_bytes];memcpy(data, old_data, used_bytes);delete old_data;}bool index_valid(size_t index){if (index >= 0 && index < used_bytes){return true;}else{return false;}}public:// iteratorclass iterator{private:typedef vector<TYPE> VECTOR;size_t pos;VECTOR *pvector;public:iterator(){}iterator(VECTOR *vect, size_t index){pvector = vect;pos = index;}size_t get_pos(){return pos;}void operator+=(size_t offset){pos += offset;}void operator++(){operator+=(1);}void operator-=(size_t offset){pos -= offset;}void operator--(){operator-=(1);}TYPE &operator*(){if (pvector->index_valid(pos)){return pvector->data[pos];}else{// raise exceptionreturn pvector->data[0];}}bool operator==(iterator &iter){return pos == iter.pos;}bool operator!=(iterator &iter){return !operator==(iter);}};vector(){data = NULL;used_bytes = 0;total_bytes = 0;}vector(size_t init_size){data = new TYPE[init_size];memset(data, 0, init_size);used_bytes = init_size;total_bytes = init_size * sizeof(TYPE);}void push_back(TYPE value){if (used_bytes >= total_bytes){resize(total_bytes + sizeof(TYPE));}data[used_bytes++] = value;}TYPE &operator[](size_t index){return data[index];}void clear(){used_bytes = 0;}size_t capacity(){return total_bytes;}size_t pop_back(){if (used_bytes > 0){--used_bytes;}}size_t size(){return used_bytes;}typedef iterator VECTOR_ITERATOR;void insert(VECTOR_ITERATOR position, TYPE &value){size_t pos = position.pos;if (!index_valid(pos)){return;}if (used_bytes == total_bytes){resize();}for (size_t i = used_bytes - 1; i >= pos; --i){data[i + 1] = data[i];}data[pos] = value;++size;}bool empty(){return used_bytes == 0;}void erase(VECTOR_ITERATOR iter){int pos = iter.get_pos();if (!index_valid(pos)){return;}for (size_t i = pos; i < used_bytes - 1; ++i){data[i] = data[i + 1];}--used_bytes;}iterator begin(){return iterator(this, 0);}iterator end(){return iterator(NULL, used_bytes);}};void vector_test(void){// constructvector<int> vect(4);// assignmentfor (int i = 0; i < 4; ++i){vect[i] = i + 1;}// add elementvect.push_back(99);// erase elementvect.erase(vect.begin());// traversalfor (vector<int>::iterator iter = vect.begin();iter != vect.end();++iter){cout << *iter << endl;}}int main(){vector_test();return 0;}

当然啦,此vector也可以放置自定义类型。下面是一个测试函数。

struct person{int age;};void vector_test_person(void){// constructvector<person> vect(4);// assignmentfor (int i = 0; i < 4; ++i){vect[i] = person{ i + 1 };}// add elementvect.push_back(person{ 88 });// erase elementvect.erase(vect.begin());// traversalfor (vector<person>::iterator iter = vect.begin();iter != vect.end();++iter){cout << (*iter).age << endl;}}

 

0 0
原创粉丝点击