自己实现 STL 迭代器

// Iterator.cpp : 定义控制台应用程序的入口点。 
// 
#include "stdafx.h" 
#include <Windows.h> 
#include <iostream> 
#include <string> 
#include <memory> 
using namespace std; 
// 对于C++,STL中已经包含迭代器的实现了 
// 就不再单独造车轮了 
// 部分代码见【STL源码剖析】 
// 来一个智能指针的示意 
namespace TEST 
{ 
template<class T> 
class auto_ptr 
{ 
public: 
// 显示构造函数 
explicit auto_ptr(T *p = NULL) : pointee(p){} 
template<class U> 
auto_ptr(auto_ptr<U>& rhs) : pointee(rhs.release()){} 
~auto_ptr() {delete pointee;} 
template<class U> 
auto_ptr<T>& operator=(auto_ptr<U>& rhs) 
{ 
if (this != &rhs) 
{ 
reset(rhs.release()); 
return *this; 
} 
} 
T& operator*() const 
{ 
return *pointee; 
} 
T* operator->() const 
{ 
return pointee; 
} 
T* get() const 
{ 
return pointee; 
} 
protected: 
T* release() 
{ 
T *p = new T; 
memcpy(p, pointee, sizeof(T)); 
delete this; 
return p; 
} 
void reset(T *p) 
{ 
if (pointee) 
{ 
delete pointee; 
pointee = NULL; 
} 
pointee = p; 
} 
private: 
T *pointee; 
}; 
} 
// 智能指针的示例 
// 申请的内存不需要释放,没有内存泄露 
void func() 
{ 
TEST::auto_ptr<string> ps(new string("Hello")); 
cout<< *ps <<endl; 
cout<< ps->size() <<endl; 
} 
namespace TEST 
{ 
template<typename T> 
class ListItem 
{ 
public: 
ListItem(T vl) 
: _value(vl) 
, _next(NULL) 
{ 
} 
T value() const {return _value;} 
ListItem *next() const {return _next;} 
void SetNext(ListItem<T> *p){_next = p;} 
private: 
T _value; 
ListItem *_next; 
}; 
// 迭代器是一种智能指针 
template<typename T> 
class List 
{ 
public: 
List() 
{ 
ListItem<T> *a = new ListItem<T>(0); // 没有析构哦 
_front = a; 
_front->SetNext(NULL); 
_size = 0; 
} 
void insert_end(T value); 
void display(std::ostream &os = std::cout) const; 
ListItem<T> * front(){return _front;} 
ListItem<T> * end() 
{ 
ListItem<T> *end = _front; 
while(1) 
{ 
if (end->next()) 
{ 
end = end->next(); 
} 
else 
{ 
break; 
} 
} 
return end; 
} 
private: 
ListItem<T> *_front; 
long _size; 
}; 
template<typename T> 
void TEST::List<T>::display( std::ostream &os /*= std::cout*/ ) const 
{ 
ListItem<T> *end = NULL; 
end = _front->next(); 
ListItem<T> *before = _front; 
do 
{ 
os<<end->value()<<endl; 
end = end->next(); 
} while (end); 
} 
// 因为只保留了链表头,所以插入操作很纠结,比较失败 
template<typename T> 
void TEST::List<T>::insert_end( T value ) 
{ 
ListItem<T> *node = new ListItem<T>(value); 
ListItem<T> *end = this->end(); 
//end = _front; 
//while(1) 
//{ 
// if (end->next()) 
// { 
// end = end->next(); 
// } 
// else 
// { 
// break; 
// } 
//} 
end->SetNext(node); 
_size ++; 
} 
template<typename Item> 
struct ListIter 
{ 
Item *ptr; 
ListIter(Item *p = NULL) 
: ptr(p) 
{ 
} 
Item& operator*() const {return *ptr;} 
Item* operator->() const {return ptr;} 
ListIter& operator++() 
{ 
ptr = ptr->next(); 
return *this; 
} 
bool operator== (const ListIter &i) 
{ 
return ptr == i.ptr; 
} 
bool operator!= (const ListIter &i) 
{ 
return ptr != i.ptr; 
} 
}; 
} 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
func(); 
TEST::List<int> testList; 
testList.insert_end(10); 
testList.insert_end(20); 
testList.insert_end(11); 
TEST::ListIter<TEST::ListItem<int>> iter(testList.front()); 
// 由于链表头为空,所以最好由后往前迭代,第一个节点不能用 
for (; iter != testList.end(); ) 
{ 
++iter; 
std::cout<<iter->value()<<endl; 
} www.2cto.com
testList.display(); 
return 0; 
} 
//输出结果: 
//Hello 
//5 
//10 
//20 
//11 
//10 
//20 
//11 
//请按任意键继续. . . 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STL(标准模板库)迭代器是一种用于访问容器元素的对象,它提供了一种统一的方式来遍历和操作容器中的元素。STL中的迭代器是用模板类实现的,它们被设计为与容器独立并提供统一的接口。 迭代器实现需要满足以下要求: 1. 提供指向容器元素的指针操作符(*),使得可以通过迭代器访问元素。 2. 提供用于移动到容器下一个或上一个元素的算术操作符(++、--),使得可以在容器中移动迭代器。 3. 提供比较操作符(==、!=、<、>等),用于比较两个迭代器的位置关系。 具体实现上,STL迭代器可以分为以下几种类型: 1. 输入迭代器(Input Iterator):仅能从容器中读取元素,只支持单向移动。 2. 输出迭代器(Output Iterator):仅能向容器中写入元素,只支持单向移动。 3. 前向迭代器(Forward Iterator):支持从容器中读取和写入元素,支持单向移动。 4. 双向迭代器(Bidirectional Iterator):支持从容器中读取和写入元素,支持双向移动。 5. 随机访问迭代器(Random Access Iterator):支持从容器中读取和写入元素,支持任意方向的移动,并且可以进行随机访问。 在STL中,不同类型的容器提供了不同级别的迭代器支持。例如,vector和deque提供了随机访问迭代器,而list只提供了双向迭代器迭代器实现是通过重载操作符和模板机制来实现的,以满足不同类型容器的特定需求。 总结起来,STL迭代器是一种通用的访问容器元素的对象,其实现通过模板类和操作符重载来实现不同级别的功能支持。这种设计使得STL的算法可以独立于具体容器而操作,提供了高度的灵活性和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值