std::list ,现在只有TYPE* 的变量,如何得到下一个元素?

辉歌 2008-07-25 10:02:50
std::list<TYPE*> mylist;

如果要遍历list的话,只能操作mylist,得到iterator,然后++或者--。

如 list<TYPE*>::iterator it = mylist.begin();
it ++,则后移,it--,则前移。

而我们学习的数据结构课程,链表的定义是:
struct DLink
{
TYPE* data;
struct DLink* next;
struct DLink* prev;
};

DLink* pHead=xxxx();

DLink* pX = pHead;

visit( pX->data);
pX = pX->next;

--------------------
类似这样的代码,直接通过DLink就可以既访问数据,又访问整个链表。真是方便。

现在std::list可麻烦了。

比如:
foo(TYPE* data)
{
...这里,我要访问递归该元素的下一个元素,怎么办?如:
if ( visit(data) ) return;
foo( data->next);
}

我只好这样做了:
foo(list<TYPE*>::iterator itMe,TYPE* data)
{
if ( visit(data) ) return;
list<TYPE*>::iterator it = ++itMe;
foo( it, *it );
}

各位有什么好的建议么?
...全文
151 6 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
kadyssss 2008-07-25
数据结构课程上主要是为了让你懂得这个list到底是怎么回事。

而STL的主要目的并不是为了让你懂得这个list是什么,而是从代码的效率,安全,可扩展等这些方面来考虑的。
至于为什么要使用迭代器,这个问题,还需要下面的高手来解释了。
  • 打赏
  • 举报
回复
hai040 2008-07-25
[Quote=引用 1 楼 w8u 的回复:]
更有甚者:
class TYPE
{
public:
void VisitForward(IVIsitor* pVisitor);
};

void TYPE::VisitForward(IVisitor* pVisitor)
{
if ( pVisitor->Visit(this) ) return;
VisitForward( this->next ); //怎么样才能这么样做?
}
[/Quote]
如果非要用TYPE访问next,可以在TYPE加上一个TYPE* next
并在插入和在链表中的位置发生变化时做相应更改
不过这跟DLink(Node)的功能重复了
  • 打赏
  • 举报
回复
lzr4304061988012 2008-07-25
LIST是模板类,它的好处就是不受元素类型的 约束,比如你要放进的 元素是int,则只要LIST<INT>就可,而数据结构那个链表,随着放进类型的不同,每次都要重新定义STRUCT,岂不是很麻烦,不过有时也很有用!
  • 打赏
  • 举报
回复
xkyx_cn 2008-07-25
2种不同的思想,不能说你习惯了前一种就不接受后一种啊

用迭代器已经很方便的操作list了,而且还可以使用stl的算法和其他功能,如果想使用stl就好好学习它
  • 打赏
  • 举报
回复
hai040 2008-07-25
传iterator,data不用传
即使是那个DLink,传TYPE*也访问不了它的下个元素
  • 打赏
  • 举报
回复
辉歌 2008-07-25
更有甚者:
class TYPE
{
public:
void VisitForward(IVIsitor* pVisitor);
};

void TYPE::VisitForward(IVisitor* pVisitor)
{
if ( pVisitor->Visit(this) ) return;
VisitForward( this->next ); //怎么样才能这么样做?
}
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ 语言
加入

6.2w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
申请成为版主
帖子事件
创建了帖子
2008-07-25 10:02
社区公告
暂无公告