CList 迭代器






2.20/5 (4投票s)
一个用于 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 ();
operator ARG_TYPE ();
布尔运算符如果存在当前节点则返回 true,否则返回 false。
链表参数运算符将返回当前节点处的元素。
导航
TLListIter<TYPE, ARG_TYPE> operator++(int);
TLListIter<TYPE, ARG_TYPE> operator--(int);
bool begin(void);
bool end(void);
后增量运算符返回当前节点并将内部位置移动到下一个节点。
后减量运算符返回当前节点并将内部位置移动到前一个节点。
// 如果列表中没有元素,这些函数将返回 false
移动到列表中的第一个节点。如果链表为空,则此函数返回 false
。
移动到列表中的最后一个节点。如果链表为空,则此函数返回 false
。
MFC 兼容性
POSITION GetPosition(void) const;
返回内部 POSITION
变量。
限制
- 目前,该类不能用于处理
bool
类型的列表。这是因为用于确定列表末尾的operator bool()
。 - 出于某种我不知道的原因(请告诉我任何解决方案),如果在
while (nNumber == 7 && iter)
中使用该类时,会生成编译器错误。相反,必须将其编码为while (nNumber == 7 && iter == true)
,然后一切都很好。真奇怪。