1.vector类的实现
重要构造定义:
template<class T>class myVector{public: typedef T value_type;//元素类型 起别名 typedef value_type* pointer;// typedef value_type* iterator;//迭代器 typedef value_type& reference;//援用 typedef const value_type* const_pointer;//常量指针 typedef const value_type& const_reference;//常量援用 typedef size_t size_type;//数据类型根本尺寸大小private: iterator start; iterator finish; iterator end_of_storage;
供类外部以及派生类应用:
protected://调配空间并填充初始值, 不返回任何值void __allocate_add_fill(size_type n, const T& value){ iterator result = (iterator)malloc(n*sizeof(T)); if (result){//result!=0 申请内存胜利,在失去的内存上创建对象 start = result; end_of_storage = start + n; finish = end_of_storage; while (n--){ //指针偏移,进行赋值 construct(result, value);//在内存上,一个个的进行结构对象 ++result; } } else{ cout << "内存不足,程序终止!" << endl; exit(0); } }
//调配空间 从first开始复制n个值到新空间中, 并返回新开拓的空间的首地址 iterator __allocate_and_copy(iterator first, size_type n){ //内存申请 iterator result = (iterator)malloc(n*sizeof(T)); iterator _start = result; if (0 != result){ while(n--){ construct(result, *first); ++result; ++first; } cout << endl; } else{ cout << "内存不足,程序终止!" << endl; exit(0); } return _start; }
//将first到last迭代器之间(first,last)的元素拷贝到_start开始的内存中, 并返回 指向 拷贝完所有数据之后最初一个数据的下一个地位的指针 iterator __copy(iterator first, iterator last, iterator _start){ while (first < last){ *_start++ = *first++; } return _start; }
//将first到last迭代器之间(first,last)的元素从新赋值iterator __fill(iterator first, iterator last, const T& value){ while (first < last){ *first++ = value; } return first;}
//本人写的 从迭代器first开始填充n个值为value的元素iterator __fill_n(iterator first, size_type n, const T& value){ while (n--){ *first++ = value; } return first;}
//本人写的 将从 [first,last)所有元素 一一顺次后移, 最初的一个元素移到end的地位void __backCopy(iterator first, iterator last, iterator end){ while (last >= first){ // *end-- = *last--; }}
供内部应用的接口:
public: //返回首元素指针 iterator begin(){ return start; } const iterator begin() const { return start; } //返回尾元素下一个地位的指针 iterator end(){ return finish; } const iterator end() const{ return finish; } //------------------ //取元素 本人写 T front(){ return *begin(); }//取vector中第一个元素 T back(){ return *(end() - 1); }//取vector中最初一个元素 //容器大小 size_type size() const{ return (size_type)(end() - begin()); } //容器的理论大小 size_type capacity() const{ return (end_of_storage - begin()); } //判断容器是否为空 bool empty(){ return begin() == end(); }
//默认构造函数 myVector() :start(NULL), finish(NULL), end_of_storage(NULL){ cout << "默认构造函数,不调配空间" << endl; }//构造函数重载 myVector(size_type n, const T& value){ __allocate_add_fill(n, value); } myVector(int n, const T&value){ __allocate_add_fill(n, value); } myVector(long n, const T&value){ __allocate_add_fill(n, value); } myVector(size_type n){ __allocate_add_fill(n, T()); }//??? T()?? myVector(int n){ __allocate_add_fill(n, T()); } myVector(long n){ __allocate_add_fill(n, T()); }
//元素操作 //删除最初一个元素 void pop_back(){ if (!empty()){ --finish; destroy(finish); } } //删除指定地位上的元素,并返回指向删除元素的迭代器 iterator erase(iterator position){ if (position > begin() && position < end()){ __copy(position + 1, finish, position); } destroy(finish); --finish; return position; }
//删除指定范畴的元素 并返回 迭代器返回的元素 iterator erase(iterator first, iterator last){ if (first > begin() && first < last && last < end()){ iterator iter = __copy(last, finish, first); destroy(iter, finish); finish -= (last - first); return first; } } //革除全副元素 void clear(){ erase(begin(), end()); }
push_back函数:
//在vector容器的前面增加一个元素,值为value void push_back(const T& value){ if (finish != end_of_storage){//如果新退出元素后,空间够用的话 construct(finish, value); ++finish; } else{//如果新退出元素之后 空间不够用的话 //重新分配空间 const size_type old_size = size(); const size_type new_size = (old_size == 0) ? 1 : 2 * old_size;//如果原空间为0,则配置1的大小,如果原空间不为0,则配置原空间二倍大小的新空间到新的地址 iterator new_start = (iterator)malloc(new_size*sizeof(T)); iterator new_finish = new_start;//开始时,未拷贝前,完结地位等于起始地位 iterator new_capacity = new_start + new_size; //内存调配要具备原子性,即: 要么全副胜利,要么全副失败 try{//1:将原空间的全副元素拷贝到新空间 2:为新的元素设定初始值 3:调整 new_finish for (iterator it = begin(); it < end(); ++it){//1:将原空间的全副元素拷贝到新空间 construct(new_finish, *it); } construct(new_finish, value);//2:为新的元素设定初始值 ++new_finish;//3:调整 new_finish } catch (...){//如果内存调配失败了 destroy(new_start, new_finish); free(new_start);//删除申请到的内存 new_start = NULL; new_finish = NULL; throw("从新分配内存失败!"); } destroy(begin(), end());//析构,并开释原vector free(start);//删除原vector的内存 start = new_start;//更改迭代器,指向新的vector finish = new_finish; end_of_storage = new_start + new_size; } }
insert函数:
//插入 在值为value的一个元素到position的地位上 void insert(iterator position, const T& value){ insert(position, 1, value); } //在position地位之后,插入n的值为value的元素 void insert(iterator position, size_type n, const T& value){ if (n == 0)return; if ((end_of_storage - finish) >= n){//备用空间够插入n个新元素 T x_copy = value; const size_type size_from_position_to_end = finish - position; iterator old_finish = finish; if (size_from_position_to_end > n){ //先从pos到oldfinish拿出后n个数,放到前面 //再将pos到剩下的几个数向后挪动到oldfinish //插入n个value到pos->pos+n __copy(finish - n, finish, finish); finish += n; __backCopy(position, old_finish - n, old_finish); __fill(position, position + n, x_copy); } else{ //在前面先插入多的value,而后再将pos到oldfinish的拿进去插到前面 //而后将剩下的value放到pos到oldfinsh __fill_n(finish, n - size_from_position_to_end, x_copy); finish += n - size_from_position_to_end; __copy(position, old_finish, finish); finish += size_from_position_to_end; __fill(position, old_finish, x_copy);//在 } } else{ //从新申请空间 const size_type old_size = size(); size_type _max = 0; if (old_size > n) _max = old_size; else _max = n; const size_type len = old_size + _max; iterator new_start = (iterator)malloc(len * sizeof(T)); iterator new_finish = new_start; //内存的调配要有原子性,即:要么全副胜利,要么全副失败。 try{ new_finish = __copy(begin(), position, new_start);//1.将原内容 至position的所有元素(不蕴含position) 拷贝到新的vector new_finish = __fill_n(new_finish, n, value);//2.将position地位到前面的n个元素都填充为value new_finish = __copy(position, end(), new_finish);//3.拷贝从 position地位到end()地位的原vector的所有残余元素 } catch (...)//如果失败了 { destroy(new_start, new_finish); free(new_start);//删除申请到的内存 new_start = new_finish = NULL; throw; //抛出异样 } //析构并开释原vector destroy(begin(), end()); //删除内存 free(start); //调整迭代器,指向新的vector start = new_start; finish = new_finish; end_of_storage = new_start + len; } }
//重载操作符 reference operator[](size_type n){ return *(begin() + n); }//取 第n个元素 const_reference operator[](size_type n) const{ return *(begin() + n); } //两个容器是否相等(每个元素) bool operator==(const myVector&v){ if (v.size() != size())return false; iterator it; for (it = v.begin(); it < v.end(); ++it){ if (*it != *(begin() + (it - v.begin()))) break; } //比拟到了最初就齐全相等 if (it == v.end()) return true; else return false; } bool operator!=(const myVector&v){ return !(operator==(v)); }};
2.自定义函数
#pragma oncetemplate<class T1, class T2>inline void construct(T1 *p, const T2 &value){ new (p)T1(value); //用placement new在所指对象上创立一个对象,value是初始化对象的值}template<class T>inline void destroy(T* pointer){//只做了一层包装,将指针所指的对象析构--通过间接调用类的析构函数 pointer->~T();}template<class ForwardIterator>inline void destroy(ForwardIterator first, ForwardIterator last){//destroy的泛化版 承受两个迭代器为参数 for (; first < last; ++first){ destroy(&*first);//得 了解一下 &* }}inline void destroy(char*, char*){};//针对 char* 的特化版inline void destroy(wchar_t*, wchar_t*){};//针对 wchar_t* 的特化版
3.测试代码
void display(const myVector<int> &v){ for (myVector<int>::iterator it = v.begin(); it != v.end(); ++it){ cout << *it << " "; } cout << endl;}void test(){ cout << "test--------" << endl; myVector<int> v(100); v.push_back(10); v.push_back(9); v.push_back(8); v.push_back(7); v.push_back(6); v.push_back(5); for (int i = 0; i < v.size(); ++i) cout << v[i] << " "; cout << endl; myVector<int>::iterator it; for (it = v.begin(); it != v.end(); ++it){ cout << *it << " "; } cout << endl; cout << "size: " << v.size() << endl;}
void test1(){ cout << "test1--------" << endl; myVector<int> v(100); v.push_back(10); v.push_back(9); v.push_back(8); v.push_back(7); v.push_back(6); v.push_back(5); myVector<int>::iterator it = v.begin() + 3; v.insert(it, 3, 300); display(v); v.insert(it, 4, 500); display(v); v.insert(it, 2, 200); display(v); v.insert(it, 2, 20); display(v); v.insert(it, 3, 30); display(v); v.insert(it, 4, 40); display(v);}
void test2(){ cout << "test2--------" << endl; myVector<int> v(100); v.push_back(10); v.push_back(9); v.push_back(8); v.push_back(7); v.push_back(6); v.push_back(5); myVector<int>::iterator it = v.begin(); v.insert(it, 300); display(v); v.insert(it, 500); display(v); v.insert(it, 200); display(v); v.insert(it, 20); display(v); v.insert(it, 30); display(v); v.insert(it, 40); display(v);}
运行后果:
/*test--------10 9 8 7 6 5 10 9 8 7 6 5 size: 6test1--------10 9 8 300 300 300 7 6 5 10 9 8 500 500 500 500 300 300 300 7 6 5 10 9 8 200 200 500 500 500 500 300 300 300 7 6 5 10 9 8 20 20 200 200 500 500 500 500 300 300 300 7 6 5 10 9 8 30 30 30 20 20 200 200 500 500 500 500 300 300 300 7 6 5 10 9 8 40 40 40 40 30 30 30 20 20 200 200 500 500 500 500 300 300 300 7 6 5 test2--------300 10 9 8 7 6 5 500 300 10 9 8 7 6 5 200 500 300 10 9 8 7 6 5 20 200 500 300 10 9 8 7 6 5 30 20 200 500 300 10 9 8 7 6 5 40 30 20 200 500 300 10 9 8 7 6 5 Program ended with exit code: 0*/
援用:https://github.com/MissStrick...