65.9K
CodeProject 正在变化。 阅读更多。
Home

CList 迭代器

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.20/5 (4投票s)

2000年10月13日

CPOL
viewsIcon

124254

downloadIcon

1071

一个用于 MFC 的 CList 链表的简单迭代类。

引言

MFC 的 CList 提供了一个模板链表实现,并且工作得很好。然而,遍历列表可能有点麻烦。像下面这样的代码在处理列表元素时很常见,但是 POSITION 变量毫无意义且令人困惑,因为它总是指向下一个节点而不是当前节点。

POSITION        pos;
CList<int, int> list;

// add nodes to the list

pos = list.GetHeadPosition();
while (pos)
{
    int nElement;

    nElement = list.GetNext(pos);
    // do something with nElement
}

TLListIter 类

我在这里提供的迭代器类稍微简化了使用,使代码更易于阅读和维护。它源于我编写的一个更大的项目,在该项目中,我有一个类型为 A 的对象列表,每个对象都有自己类型为 B 的对象列表,我需要迭代系统中的所有类型为 B 的对象。这个类极大地简化了任务。

因此,使用这个类,上面的代码变为

CList<int, int>      list;		// linked list
TLListIter<int, int> iter(list);	// linked list iterator
// add nodes to the list

iter.begin();
while (iter)
{
    int nElement;

    nElement = iter++;
    // do something with nElement
}

公共成员

构造/析构

  • TLListIter(TLList<TYPE, ARG_TYPE> &__list);
  • 构造函数,用于将迭代器初始化为要迭代的链表。

  • TLListIter(TLListIter<TYPE, ARG_TYPE> &__iter);
  • 复制构造函数,用于为同一个链表创建新的迭代器,并具有相同的节点位置。

  • virtual ~TLListIter();
  • 虚类析构函数。

运算符

  • operator bool ();
  • 布尔运算符如果存在当前节点则返回 true,否则返回 false。

  • operator ARG_TYPE ();
  • 链表参数运算符将返回当前节点处的元素。

导航

  • TLListIter<TYPE, ARG_TYPE> operator++(int);
  • 后增量运算符返回当前节点并将内部位置移动到下一个节点。

  • TLListIter<TYPE, ARG_TYPE> operator--(int);
  • 后减量运算符返回当前节点并将内部位置移动到前一个节点。

    // 如果列表中没有元素,这些函数将返回 false

  • bool begin(void);
  • 移动到列表中的第一个节点。如果链表为空,则此函数返回 false

  • bool end(void);
  • 移动到列表中的最后一个节点。如果链表为空,则此函数返回 false

MFC 兼容性

POSITION GetPosition(void) const;

返回内部 POSITION 变量。

限制

  • 目前,该类不能用于处理 bool 类型的列表。这是因为用于确定列表末尾的 operator bool()
  • 出于某种我不知道的原因(请告诉我任何解决方案),如果在 while (nNumber == 7 && iter) 中使用该类时,会生成编译器错误。相反,必须将其编码为 while (nNumber == 7 && iter == true),然后一切都很好。真奇怪。
© . All rights reserved.