c++ list容器与迭代器

jungegexxoo 2010-11-10 09:59:40
#include<iostream>
template<class Type>class list;
template<class Type>
class Node
{
public:
friend class list<Type>;
Node(): next(NULL) {}
Node(const Type& d,Node<Type>* n=NULL): data(d),next(n) {}
Type& Data() { return data; }
private:
Type data;
Node<Type>* next;
};
//
template<class Type>
class list
{
public:
class iterator
{
public:
iterator(): curptr(NULL) {}
iterator(Node<Type>* cur): curptr(cur) {}
iterator(const iterator& iter) { curptr=iter.curptr; }
iterator& operator=(const iterator& iter) { curptr=iter.curptr; return *this; }
bool operator==(const iterator& iter) { return curptr==iter.curptr; }
bool operator!=(const iterator& iter) { return !(curptr==iter.curptr); }
iterator operator++() { curptr++; return *this; }
iterator operator++(int) { iterator temp=*this; curptr++; return temp; }
Type operator*() { return curptr->Data(); }
private:
Node<Type>* curptr;
};
list() { head=tail=new Node<Type>; }
void push_back(const Type& t);
iterator begin() { return head->next; }
iterator end() { return NULL; }
void clear();
~list() { clear(); delete head; }
private:
Node<Type>* head;
Node<Type>* tail;
};
template<class Type>
void list<Type>::push_back(const Type& t)
{
tail->next=new Node<Type>(t);
tail=tail->next;
}
template<class Type>
void list<Type>::clear()
{
Node<Type>* p=head->next;
while(p)
{
head->next=p->next;
delete p;
p=head->next;
}
head->next=NULL;
}

int main()
{
list<int> l1;
for(int i=1;i<5;i++) l1.push_back(i);
for(list<int>::iterator iter=l1.begin();iter!=l1.end();iter++) //迭代器有问题,不能正确输出,why?
std::cout<<*iter;
return 0;
}
//求各位大侠,这个怎么改代码呀,谢谢了。
...全文
69 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sun5213784 2010-11-10
  • 打赏
  • 举报
回复
你就直接把stl里的源码 拷贝就好了
GoonYangXiaofang 2010-11-10
  • 打赏
  • 举报
回复
list 链表的迭代器自加的实现
iterator operator++() { curptr++; return *this; }
iterator operator++(int) { iterator temp=*this; curptr++; return temp; }

应改为:
iterator& operator++() { curptr = curptr->next; return *this; }
iterator& operator++(int) { iterator temp(*this); curptr = curptr->next; return temp; }

因为是链表


#include<iostream>
using namespace std;

template<class Type> class list;

template<class Type>
class Node
{
public:
friend class list<Type>;
Node(): next(NULL) {}
Node(const Type& d,Node<Type>* n=NULL): data(d),next(n) {}
Type& Data() { return data; }
private:
Type data;
Node<Type>* next;
};
//
template<class Type>
class list
{
public:
class iterator
{
public:
iterator(): curptr(NULL) {}
iterator(Node<Type>* cur): curptr(cur) {}
iterator(const iterator& iter) { curptr=iter.curptr; }
iterator& operator=(const iterator& iter) { curptr=iter.curptr; return *this; }
bool operator==(const iterator& iter) { return curptr==iter.curptr; }
bool operator!=(const iterator& iter) { return !(curptr==iter.curptr); }
iterator& operator++() { curptr = curptr->next/*curptr++*/; return *this; }
iterator& operator++(int) { iterator temp(*this); curptr = curptr->next/*curptr++*/; return temp; }
Type operator*() { return curptr->Data(); }
private:
Node<Type>* curptr;
};
list() { head=tail=new Node<Type>; }
void push_back(const Type& t);
iterator begin() { return head->next; }
iterator end() { return NULL; }
void clear();
~list() { clear(); delete head; }
private:
Node<Type>* head;
Node<Type>* tail;
};
template<class Type>
void list<Type>::push_back(const Type& t)
{
tail->next=new Node<Type>(t);
tail=tail->next;
}
template<class Type>
void list<Type>::clear()
{
Node<Type>* p=head->next;
while(p)
{
head->next=p->next;
delete p;
p=head->next;
}
head->next=NULL;
}

int main()
{
list<int> l1;
for(int i=1;i<5;i++)
l1.push_back(i);
for(list<int>::iterator iter=l1.begin();iter!=l1.end(); ++iter) //迭代器有问题,不能正确输出,why?
std::cout<<*iter << std::endl;


return 0;
}

64,644

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧