首页IT科技MyVector中加入迭代器功能

MyVector中加入迭代器功能

时间2025-05-04 13:59:58分类IT科技浏览2946
导读:我们之前有中的第<四>节 理解空间配置器allocator优化STL中的Vector 我将在此基础上加入迭代器功能代码 Iterator 为什么可以遍历所有的容器的方式都一样?...

我们之前有中的第<四>节 理解空间配置器allocator优化STL中的Vector

我将在此基础上加入迭代器功能代码 Iterator 为什么可以遍历所有的容器的方式都一样? auto it =continer.beign(); for( ;it!=continer.end();++it){ cout<<*it<<endl; } //我们在自己的容器里的 Iterator de ++ , * 由自己来实现,所有对外部使用者来看都是统一的. //泛型算法能够给所有的容器都使用,也是基于容器对外提供了统一的遍历接口, 其参数接受的都是容器的迭代器 #include <iostream> using namespace std; class person { public: //构造函数 person(int _age=1,char * _pname=nullptr): age(_age) { if (_pname == nullptr) { pname = new char[1]; pname[0] = \0; } else { int size = strlen(_pname); pname = new char[size + 1]; strcpy(pname, _pname); } cout << "创建student对象,地址=" << this << endl; } //拷贝构造函数 person(const person & _person) { this->age = _person.age; int size = strlen(_person.pname); pname = new char[size + 1]; strcpy(this->pname, _person.pname); } //赋值函数 person & operator=(const person & _person) { if (this == &_person) { return *this; } delete[]pname; pname = nullptr; this->age = _person.age; int size = strlen(_person.pname); pname = new char[size + 1]; strcpy(this->pname, _person.pname); return *this; } ~person() { cout << "析构 person =" <<pname << " "<<age << endl; delete[]pname; pname = nullptr; } private: int age; char * pname; friend ostream & operator<<(ostream & out, const person & _value); }; ostream & operator<<(ostream & out, const person & _value) { cout << _value.pname<<" == "<< _value.age << " " << endl; return out; } template <typename T> class Allocate4 { public: //分配内存空间,不创建对象 T * allocator(int size=4) { return (T *)malloc(sizeof(T)*size); } //在指定的内存空间地址,构建 T对象 void constract(T * pAddress, const T & _val) { new (pAddress) T(_val); } //释放指定位置的内存空间 void delAllocator(T * pAddress) { if (pAddress != nullptr) { free(pAddress); pAddress = nullptr; } } //析构指定内存位置 void destory(T * pAddress) { pAddress->~T();//调用析构函数 } }; template<typename T,typename Allocate= Allocate4<T>> //类模板 class MyVector4 { public: MyVector4<T,Allocate>(int size = 4 , const Allocate _rallocator = Allocate4<T>) : _allocator(_rallocator) { pfirst = _allocator.allocator(size); last = pfirst; pend = pfirst + size; cout << "MyVector开辟内存地址=" << pfirst<<endl; } MyVector4<T, Allocate>(const MyVector4<T, Allocate> & _vector) { //1:根据原vector的空间大小申请新的内存空间 pfirst = _allocator.allocator(_vector.size()); last = pfirst; pend = pfirst + size; //2:将原vector空间中的有效对象赋值到新的vector中 T * _pFlag = _vector.pfirst; while (_pFlag != _vector.last) { _allocator.constract(last, *_pFlag); _pFlag++; last++; } } MyVector4<T, Allocate> & operator=(const MyVector4<T, Allocate> & _vector) { if (this == &_vector) { return *this; } //1:析构现有vector中的有效对象 T * _pFlag = pfirst; while (_pFlag !=last) { _allocator.destory(_pFlag); _pFlag++; } //2:释放现有的vector申请的堆内存空间 _allocator.delAllocator(pfirst); pfirst = nullptr; pend = nullptr; last = nullptr; //3:根据_vector的内存空间大小,申请新的堆内存空间 pfirst = _allocator.allocator(_vector.size()); last = pfirst; pend = pfirst + _vector.size(); //4:将_vector中有效的对象复制到现在新的堆空间中 T * _pFlag = _vector.pfirst; while (_pFlag != _vector.last) { _allocator.constract(last, *_pFlag); _pFlag++; last++; } } void pushBack(const T & _val) { if (Full()) { Expend(); } _allocator.constract(last, _val); cout << "pushBack 原对象 地址=" << &_val <<"放在内存位置 "<<last<< endl; this->last++; } void popBack() { if (Empty()) { return ; } _allocator.destory(this->last-1); this->last--; } //内存空间扩展 void Expend() { int newSize = 2*this->size(); //1:申请新的内存空间 T * tep_pfirst = _allocator.allocator(newSize); T * tep_last = tep_pfirst; T * tep_pend = tep_pfirst + newSize; //2:原当前vector中原有效的对象复制到新的堆空间上 T * _pFlag = pfirst; while (_pFlag != last) { _allocator.constract(tep_last, *_pFlag); _pFlag++; tep_last++; } //3:析构原有对象 _pFlag = pfirst; while (_pFlag != last) { _allocator.destory(_pFlag); _pFlag++; } //4:释放原有的vector申请的堆内存空间 _allocator.delAllocator(pfirst); pfirst = nullptr; pend = nullptr; last = nullptr; //5:指针重新指向 pfirst = tep_pfirst; last = tep_last; pend = tep_pend; cout << "MyVector空间2倍扩展,新的地址=" << pfirst << endl; } bool Empty() const { return this->pfirst == this->last; } bool Full() const { return this->pend == this->last; } int size() { return this->pend - this->pfirst; } void showVectorInfo() { T * tep = pfirst; while (tep < last) { cout << "打印Vector中有效对象地址=" << tep << endl; tep++; } } //定义属于自己的迭代器 class Iterator { public: Iterator( T * _pAddress=nullptr):pAddress(_pAddress) { } const T & operator*() const { return *pAddress; } T & operator*() { return *pAddress; } //前置++ void operator++() { this->pAddress++; } bool operator!=(const Iterator & src) const { return this->pAddress != src.pAddress; } private: T * pAddress; }; Iterator begin() const { return Iterator(this->pfirst); } Iterator end() const { return Iterator(this->last); } private: T * pfirst;//指向首元素地址 T * pend; // 指向容器最后位置的下一个地址 T * last; //指向最后一个有效元素的下一个位置 Allocate _allocator; }; void testV4() { MyVector4<person, Allocate4<person>> v5(4,Allocate4<person>()); person p1(10,"zs1"); v5.pushBack(p1); person p2(20, "zs2"); v5.pushBack(p2); person p3(30, "zs3"); v5.pushBack(p3); person p4(40, "zs4"); v5.pushBack(p4); v5.showVectorInfo(); cout << "-------" << endl; person p5(50, "zs5"); v5.pushBack(p5); v5.showVectorInfo(); v5.popBack(); MyVector4<person, Allocate4<person>>::Iterator it_begin = v5.begin(); MyVector4<person, Allocate4<person>>::Iterator it_end = v5.end(); cout << "---iterator begin----" << endl; for (; it_begin != it_end; ++it_begin) { cout << *it_begin << endl; } cout << "---iterator end----" << endl; } int main() { testV4(); system("pause"); return 0; }//pendl

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
char在java中是用来干嘛的(由char和byte的关系引申出去——总结一下java中的字符编码相关知识)