此类提供用于创建和管理列表对象的方法。
语法
template<typename E, class ETraits = CElementTraits<E>>
class CAtlList
参数
E
元素类型。
ETraits
用于复制或移动元素的代码。 有关更多详细信息,请参阅 CElementTraits 类。
成员
公共 Typedef
| 名称 | 描述 |
|---|---|
| CAtlList::INARGTYPE |
公共构造函数
| 名称 | 描述 |
|---|---|
| CAtlList::CAtlList | 构造函数。 |
| CAtlList::~CAtlList | 析构函数。 |
公共方法
| 名称 | 描述 |
|---|---|
| CAtlList::AddHead | 调用此方法可将元素添加到列表的头部。 |
| CAtlList::AddHeadList | 调用此方法可将现有列表添加到列表的头部。 |
| CAtlList::AddTail | 调用此方法可将元素添加到此列表的尾部。 |
| CAtlList::AddTailList | 调用此方法可将现有列表添加到此列表的尾部。 |
| CAtlList::AssertValid | 调用此方法可确认列表是否有效。 |
| CAtlList::Find | 调用此方法可在列表中搜索指定的元素。 |
| CAtlList::FindIndex | 在指定了索引值的情况下,调用此方法可获取元素的位置。 |
| CAtlList::GetAt | 调用此方法可返回位于列表中指定位置的元素。 |
| CAtlList::GetCount | 调用此方法可返回列表中的对象数。 |
| CAtlList::GetHead | 调用此方法可返回位于列表头部位置的元素。 |
| CAtlList::GetHeadPosition | 调用此方法可获取列表的头部位置。 |
| CAtlList::GetNext | 调用此方法可返回列表中的下一个元素。 |
| CAtlList::GetPrev | 调用此方法可返回列表中的上一个元素。 |
| CAtlList::GetTail | 调用此方法可返回位于列表尾部位置的元素。 |
| CAtlList::GetTailPosition | 调用此方法可获取列表的尾部位置。 |
| CAtlList::InsertAfter | 调用此方法可将新元素插入到列表中的指定位置之后。 |
| CAtlList::InsertBefore | 调用此方法可将新元素插入到列表中的指定位置之前。 |
| CAtlList::IsEmpty | 调用此方法可确定列表是否为空。 |
| CAtlList::MoveToHead | 调用此方法可将指定的元素移到列表的头部。 |
| CAtlList::MoveToTail | 调用此方法可将指定的元素移到列表的尾部。 |
| CAtlList::RemoveAll | 调用此方法可从列表中删除所有元素。 |
| CAtlList::RemoveAt | 调用此方法可从列表中删除单个元素。 |
| CAtlList::RemoveHead | 调用此方法可删除位于列表头部位置的元素。 |
| CAtlList::RemoveHeadNoReturn | 调用此方法可删除位于列表头部位置的元素且不返回值。 |
| CAtlList::RemoveTail | 调用此方法可删除位于列表尾部位置的元素。 |
| CAtlList::RemoveTailNoReturn | 调用此方法可删除位于列表尾部位置的元素且不返回值。 |
| CAtlList::SetAt | 调用此方法可在列表中的给定位置设置元素的值。 |
| CAtlList::SwapElements | 调用此方法可交换列表中的元素。 |
备注
CAtlList 类支持可按顺序或值访问的不唯一对象的有序列表。 CAtlList 列表的行为类似于双重链接列表。 每个列表具有一个头部和一个尾部,新元素(或某些情况下为列表)可以添加到列表的任一端,或者插入到特定元素的前面或后面。
大多数 CAtlList 方法使用位置值。 方法使用此值来引用存储元素的实际内存位置,不应直接计算或预测。 如果需要访问列表中的第 n 个元素,方法 CAtlList::FindIndex 将返回给定索引的相应位置值。 方法 CAtlList::GetNext 和 CAtlList::GetPrev 可用于迭代列表中的对象。
有关可用于 ATL 的集合类的详细信息,请参阅 ATL 集合类。
要求
标头:atlcoll.h
CAtlList::AddHead
调用此方法可将元素添加到列表的头部。
POSITION AddHead();
POSITION AddHead(INARGTYPE element);
参数
element
新元素。
返回值
返回新添加的元素的位置。
备注
如果使用第一个版本,则会使用其默认构造函数而不是复制构造函数来创建一个空元素。
示例
// Declare a list of integers
CAtlList<int> myList;
// Add some elements, each to the head of the list.
// As each new element is added, the previous head is
// pushed down the list.
myList.AddHead(42);
myList.AddHead(49);
// Confirm the value currently at the head of the list
ATLASSERT(myList.GetHead() == 49);
// Confirm the value currently at the tail of the list
ATLASSERT(myList.GetTail() == 42);
CAtlList::AddHeadList
调用此方法可将现有列表添加到列表的头部。
void AddHeadList(const CAtlList<E, ETraits>* plNew);
参数
plNew
要添加的列表。
备注
plNew 指向的列表将插入到现有列表的开头。 在调试版本中,如果 plNew 等于 NULL,将发生断言失败。
示例
// Define two lists of integers
CAtlList<int> myList1;
CAtlList<int> myList2;
// Fill up the first list
myList1.AddTail(1);
myList1.AddTail(2);
myList1.AddTail(3);
// Add an element to the second list
myList2.AddTail(4);
// Insert the first list into the second
myList2.AddHeadList(&myList1);
// The second list now contains:
// 1, 2, 3, 4
CAtlList::AddTail
调用此方法可将元素添加到此列表的尾部。
POSITION AddTail();
POSITION AddTail(INARGTYPE element);
参数
element
要添加的元素。
返回值
返回新添加的元素的位置。
备注
如果使用第一个版本,则会使用其默认构造函数而不是复制构造函数来创建一个空元素。 该元素将添加到列表的末尾,因此它现在成了尾部。 此方法可用于空列表。
示例
// Define the list
CAtlList<int> myList;
// Add elements to the tail
myList.AddTail(1);
myList.AddTail(2);
myList.AddTail(3);
// Confirm the current head of the list
ATLASSERT(myList.GetHead() == 1);
// Confirm the current tail of the list
ATLASSERT(myList.GetTail() == 3);
CAtlList::AddTailList
调用此方法可将现有列表添加到此列表的尾部。
void AddTailList(const CAtlList<E, ETraits>* plNew);
参数
plNew
要添加的列表。
备注
plNew 指向的列表将插入到列表对象中最后一个元素(如果有)的后面。 plNew 列表中的最后一个元素因此成了尾部。 在调试版本中,如果 plNew 等于 NULL,将发生断言失败。
示例
// Define two integer lists
CAtlList<int> myList1;
CAtlList<int> myList2;
// Fill up the first list
myList1.AddTail(1);
myList1.AddTail(2);
myList1.AddTail(3);
// Add an element to the second list
myList2.AddTail(4);
// Insert the first list into the second
myList2.AddTailList(&myList1);
// The second list now contains:
// 4, 1, 2, 3
CAtlList::AssertValid
调用此方法可确认列表是否有效。
void AssertValid() const;
备注
在调试版本中,如果列表对象无效,则会发生断言失败。 要使列表对象有效,空列表的头部和尾部都必须指向 NULL,而非空列表的头部和尾部必须都指向有效地址。
示例
// Define the list
CAtlList<int> myList;
// AssertValid only exists in debug builds
#ifdef _DEBUG
myList.AssertValid();
#endif
CAtlList::CAtlList
构造函数。
CAtlList(UINT nBlockSize = 10) throw();
参数
nBlockSize
块大小。
注解
CAtlList 对象的构造函数。 块大小用于衡量在需要新元素时分配的内存量。 较大的块大小可减少对内存分配例程的调用,但会使用更多资源。
示例
// Define two lists
CAtlList<int> myList1;
CAtlList<double> myList2;
CAtlList::~CAtlList
析构函数。
~CAtlList() throw();
备注
释放所有已分配的资源,包括调用 CAtlList::RemoveAll 以从列表中删除所有元素。
在调试版本中,如果列表在调用 RemoveAll 后仍包含某些元素,则会发生断言失败。
CAtlList::Find
调用此方法可在列表中搜索指定的元素。
POSITION Find(INARGTYPE element, POSITION posStartAfter = NULL) const throw();
参数
element
要在列表中查找的元素。
posStartAfter
搜索的起始位置。 如果未指定任何值,则搜索从头部元素开始。
返回值
如果找到,则返回元素的 POSITION 值,否则返回 NULL。
备注
在调试版本中,如果列表对象无效或 posStartAfter 值超出范围,则会发生断言失败。
示例
// Define the integer list
CAtlList<int> myList;
// Populate the list
myList.AddTail(100);
myList.AddTail(200);
myList.AddTail(300);
myList.AddTail(400);
// Find the '300' element in the list,
// starting from the list head.
POSITION myPos = myList.Find(300);
// Confirm that the element was found
ATLASSERT(myList.GetAt(myPos) == 300);
CAtlList::FindIndex
在指定了索引值的情况下,调用此方法可获取元素的位置。
POSITION FindIndex(size_t iElement) const throw();
参数
iElement
所需列表元素的从零开始的索引。
返回值
返回相应的 POSITION 值,如果 iElement 超出范围,则返回 NULL。
注解
此方法返回对应于给定索引值的 POSITION,以便可以访问列表中的第 n 个元素。
在调试版本中,如果列表对象无效,则会发生断言失败。
示例
// Define the integer list
CAtlList<int> myList;
// Populate the list
for (int i = 0; i < 100; i++)
{
myList.AddTail(i);
}
// Iterate through the entire list
for (size_t j = 0; j < myList.GetCount(); j++)
{
size_t i = myList.GetAt(myList.FindIndex(j));
ATLASSERT(i == j);
}
CAtlList::GetAt
调用此方法可返回位于列表中指定位置的元素。
E& GetAt(POSITION pos) throw();
const E& GetAt(POSITION pos) const throw();
参数
pos
用于指定特定元素的 POSITION 值。
返回值
对元素或其副本的引用。
备注
如果列表为 const,则 GetAt 返回元素的副本。 允许仅对赋值语句的右侧使用该方法并防止修改列表。
如果列表不为 const,则 GetAt 返回对元素的引用。 允许对赋值语句的任一侧使用该方法,从而允许修改列表条目。
在调试版本中,如果 pos 等于 NULL,则会发生断言失败。
示例
请参阅 CAtlList::FindIndex 的示例。
CAtlList::GetCount
调用此方法可返回列表中的对象数。
size_t GetCount() const throw();
返回值
返回列表中元素的数目。
示例
请参阅 CAtlList::Find 的示例。
CAtlList::GetHead
调用此方法可返回位于列表头部位置的元素。
E& GetHead() throw();
const E& GetHead() const throw();
返回值
返回对位于列表头部位置的元素或其副本的引用。
备注
如果列表为 const,则 GetHead 返回位于列表头部位置的元素的副本。 允许仅对赋值语句的右侧使用该方法并防止修改列表。
如果列表不为 const,则 GetHead 返回对位于列表头部位置的元素的引用。 允许对赋值语句的任一侧使用该方法,从而允许修改列表条目。
在调试版本中,如果列表的头部指向 NULL,则会发生断言失败。
示例
请参阅 CAtlList::AddHead 的示例。
CAtlList::GetHeadPosition
调用此方法可获取列表的头部位置。
POSITION GetHeadPosition() const throw();
返回值
返回与位于列表头部位置的元素对应的 POSITION 值。
备注
如果列表为空,则返回的值为 NULL。
示例
// Define the integer list
CAtlList<int> myList;
int i;
// Populate the list
for (i = 0; i < 100; i++)
{
myList.AddTail(i);
}
// Get the starting position value
POSITION myPos = myList.GetHeadPosition();
// Iterate through the entire list
i = 0;
int j;
do {
j = myList.GetNext(myPos);
ATLASSERT(i == j);
i++;
} while (myPos != NULL);
CAtlList::GetNext
调用此方法可返回列表中的下一个元素。
E& GetNext(POSITION& pos) throw();
const E& GetNext(POSITION& pos) const throw();
参数
pos
先前的 GetNext 调用、CAtlList::GetHeadPosition 或其他 CAtlList 方法返回的 POSITION 值。
返回值
如果列表为 const,则 GetNext 返回列表的下一个元素的副本。 允许仅对赋值语句的右侧使用该方法并防止修改列表。
如果列表不为 const,则 GetNext 返回对列表的下一个元素的引用。 允许对赋值语句的任一侧使用该方法,从而允许修改列表条目。
备注
POSITION 计数器 pos 将更新为指向列表中的下一个元素,如果没有其他元素,则为 NULL。 在调试版本中,如果 pos 等于 NULL,则会发生断言失败。
示例
请参阅 CAtlList::GetHeadPosition 的示例。
CAtlList::GetPrev
调用此方法可返回列表中的上一个元素。
E& GetPrev(POSITION& pos) throw();
const E& GetPrev(POSITION& pos) const throw();
参数
pos
先前的 GetPrev 调用、CAtlList::GetTailPosition 或其他 CAtlList 方法返回的 POSITION 值。
返回值
如果列表为 const,则 GetPrev 返回列表的某个元素的副本。 允许仅对赋值语句的右侧使用该方法并防止修改列表。
如果列表不为 const,则 GetPrev 返回对列表的某个元素的引用。 允许对赋值语句的任一侧使用该方法,从而允许修改列表条目。
备注
POSITION 计数器 pos 将更新为指向列表中的上一个元素,如果没有其他元素,则为 NULL。 在调试版本中,如果 pos 等于 NULL,则会发生断言失败。
示例
请参阅 CAtlList::GetTailPosition 的示例。
CAtlList::GetTail
调用此方法可返回位于列表尾部位置的元素。
E& GetTail() throw();
const E& GetTail() const throw();
返回值
返回对位于列表尾部位置的元素或其副本的引用。
备注
如果列表为 const,则 GetTail 返回位于列表头部位置的元素的副本。 允许仅对赋值语句的右侧使用该方法并防止修改列表。
如果列表不为 const,则 GetTail 返回对位于列表头部位置的元素的引用。 允许对赋值语句的任一侧使用该方法,从而允许修改列表条目。
在调试版本中,如果列表的尾部指向 NULL,则会发生断言失败。
示例
请参阅 CAtlList::AddTail 的示例。
CAtlList::GetTailPosition
调用此方法可获取列表的尾部位置。
POSITION GetTailPosition() const throw();
返回值
返回与位于列表尾部位置的元素对应的 POSITION 值。
注解
如果列表为空,则返回的值为 NULL。
示例
// Define the integer list
CAtlList<int> myList;
int i;
// Populate the list
for (i = 0; i < 100; i++)
{
myList.AddHead(i);
}
// Get the starting position value
POSITION myP = myList.GetTailPosition();
// Iterate through the entire list
i = 0;
int j;
do {
j = myList.GetPrev(myP);
ATLASSERT(i == j);
i++;
} while (myP != NULL);
CAtlList::INARGTYPE
作为输入参数传递元素时使用的类型。
typedef ETraits::INARGTYPE INARGTYPE;
CAtlList::InsertAfter
调用此方法可将新元素插入到列表中的指定位置之后。
POSITION InsertAfter(POSITION pos, INARGTYPE element);
参数
pos
要在其后插入新元素的 POSITION 值。
element
要插入的元素。
返回值
返回新元素的 POSITION 值。
备注
在调试版本中,如果列表无效、插入失败或尝试在尾部之后插入元素,则会发生断言失败。
示例
// Define the integer list
CAtlList<int> myList;
// Populate the list
POSITION myPos = myList.AddHead(1);
myPos = myList.InsertAfter(myPos, 2);
myPos = myList.InsertAfter(myPos, 3);
// Confirm the tail value is as expected
ATLASSERT(myList.GetTail() == 3);
CAtlList::InsertBefore
调用此方法可将新元素插入到列表中的指定位置之前。
POSITION InsertBefore(POSITION pos, INARGTYPE element);
参数
pos
新元素将插入到列表中此 POSITION 值之前。
element
要插入的元素。
返回值
返回新元素的 POSITION 值。
备注
在调试版本中,如果列表无效、插入失败或尝试在头部之前插入元素,则会发生断言失败。
示例
// Define the integer list
CAtlList<int> myList;
// Populate the list
POSITION myPos = myList.AddHead(1);
myPos = myList.InsertBefore(myPos, 2);
myPos = myList.InsertBefore(myPos, 3);
// Confirm the head value is as expected
ATLASSERT(myList.GetHead() == 3);
CAtlList::IsEmpty
调用此方法可确定列表是否为空。
bool IsEmpty() const throw();
返回值
如果列表不包含任何对象,则返回 true,否则返回 false。
示例
// Define the integer list
CAtlList<int> myList;
// Populate the list
myList.AddTail(1);
myList.AddTail(2);
myList.AddTail(3);
myList.AddTail(4);
// Confirm not empty
ATLASSERT(myList.IsEmpty() == false);
// Remove the tail element
myList.RemoveTailNoReturn();
// Confirm not empty
ATLASSERT(myList.IsEmpty() == false);
// Remove the head element
myList.RemoveHeadNoReturn();
// Confirm not empty
ATLASSERT(myList.IsEmpty() == false);
// Remove all remaining elements
myList.RemoveAll();
// Confirm empty
ATLASSERT(myList.IsEmpty() == true);
CAtlList::MoveToHead
调用此方法可将指定的元素移到列表的头部。
void MoveToHead(POSITION pos) throw();
参数
pos
要移动的元素的 POSITION 值。
备注
指定的元素将从其当前位置移到列表的头部。 在调试版本中,如果 pos 等于 NULL,则会发生断言失败。
示例
// Define the integer list
CAtlList<int> myList;
// Populate the list
myList.AddTail(1);
myList.AddTail(2);
myList.AddTail(3);
myList.AddTail(4);
// Move the tail element to the head
myList.MoveToHead(myList.GetTailPosition());
// Confirm the head is as expected
ATLASSERT(myList.GetHead() == 4);
// Move the head element to the tail
myList.MoveToTail(myList.GetHeadPosition());
// Confirm the tail is as expected
ATLASSERT(myList.GetTail() == 4);
CAtlList::MoveToTail
调用此方法可将指定的元素移到列表的尾部。
void MoveToTail(POSITION pos) throw();
参数
pos
要移动的元素的 POSITION 值。
备注
指定的元素将从其当前位置移到列表的尾部。 在调试版本中,如果 pos 等于 NULL,则会发生断言失败。
示例
请参阅 CAtlList::MoveToHead 的示例。
CAtlList::RemoveAll
调用此方法可从列表中删除所有元素。
void RemoveAll() throw();
备注
此方法从列表中删除所有元素并释放已分配的内存。 在调试版本中,如果未删除所有元素或列表结构已损坏,则会引发 ATLASSERT。
示例
请参阅 CAtlList::IsEmpty 的示例。
CAtlList::RemoveAt
调用此方法可从列表中删除单个元素。
void RemoveAt(POSITION pos) throw();
参数
pos
要删除的元素的 POSITION 值。
备注
将删除 pos 引用的元素并释放内存。 可以使用 RemoveAt 删除列表的头部或尾部。
在调试版本中,如果列表无效或删除元素会导致列表访问不属于列表结构的内存,则会发生断言失败。
示例
// Define the integer list
CAtlList<int> myList;
// Populate the list
myList.AddTail(100);
myList.AddTail(200);
myList.AddTail(300);
// Use RemoveAt to remove elements one by one
myList.RemoveAt(myList.Find(100));
myList.RemoveAt(myList.Find(200));
myList.RemoveAt(myList.Find(300));
// Confirm all have been deleted
ATLASSERT(myList.IsEmpty() == true);
CAtlList::RemoveHead
调用此方法可删除位于列表头部位置的元素。
E RemoveHead();
返回值
返回位于列表头部位置的元素。
备注
从列表中删除头部元素并释放内存。 返回元素的副本。 在调试版本中,如果列表为空,则会发生断言失败。
示例
// Define the integer list
CAtlList<int> myList;
// Populate the list
myList.AddTail(100);
myList.AddTail(200);
myList.AddTail(300);
// Confirm the head of the list
ATLASSERT(myList.GetHead() == 100);
// Remove the head of the list
ATLASSERT(myList.RemoveHead() == 100);
// Confirm the new head of the list
ATLASSERT(myList.GetHead() == 200);
CAtlList::RemoveHeadNoReturn
调用此方法可删除位于列表头部位置的元素且不返回值。
void RemoveHeadNoReturn() throw();
备注
从列表中删除头部元素并释放内存。 在调试版本中,如果列表为空,则会发生断言失败。
示例
请参阅 CAtlList::IsEmpty 的示例。
CAtlList::RemoveTail
调用此方法可删除位于列表尾部位置的元素。
E RemoveTail();
返回值
返回位于列表尾部位置的元素。
备注
从列表中删除尾部元素并释放内存。 返回元素的副本。 在调试版本中,如果列表为空,则会发生断言失败。
示例
// Define the integer list
CAtlList<int> myList;
// Populate the list
myList.AddTail(100);
myList.AddTail(200);
myList.AddTail(300);
// Confirm the tail of the list
ATLASSERT(myList.GetTail() == 300);
// Remove the tail of the list
ATLASSERT(myList.RemoveTail() == 300);
// Confirm the new tail of the list
ATLASSERT(myList.GetTail() == 200);
CAtlList::RemoveTailNoReturn
调用此方法可删除位于列表尾部位置的元素且不返回值。
void RemoveTailNoReturn() throw();
注解
从列表中删除尾部元素并释放内存。 在调试版本中,如果列表为空,则会发生断言失败。
示例
请参阅 CAtlList::IsEmpty 的示例。
CAtlList::SetAt
调用此方法可在列表中的给定位置设置元素的值。
void SetAt(POSITION pos, INARGTYPE element);
参数
pos
与要更改的元素对应的 POSITION 值。
element
新元素值。
备注
将现有值替换为 element。 在调试版本中,如果 pos 等于 NULL,则会发生断言失败。
示例
// Define the integer list
CAtlList<int> myList;
// Populate the list
myList.AddTail(100);
myList.AddTail(200);
// Use SetAt to change the values stored in the head and
// tail of the list
myList.SetAt(myList.GetHeadPosition(), myList.GetHead() * 10);
myList.SetAt(myList.GetTailPosition(), myList.GetTail() * 10);
// Confirm the values
ATLASSERT(myList.GetHead() == 1000);
ATLASSERT(myList.GetTail() == 2000);
CAtlList::SwapElements
调用此方法可交换列表中的元素。
void SwapElements(POSITION pos1, POSITION pos2) throw();
参数
pos1
第一个 POSITION 值。
pos2
第二个 POSITION 值。
注解
交换位于两个指定位置的元素。 在调试版本中,如果任一位置值等于 NULL,则会发生断言失败。
示例
// Define the integer list
CAtlList<int> myList;
// Populate the list
for (int i = 0; i < 100; i++)
{
myList.AddHead(i);
}
// Order is: 99, 98, 97, 96...
ATLASSERT(myList.GetHead() == 99);
ATLASSERT(myList.GetTail() == 0);
// Perform a crude bubble sort
for (int j = 0; j < 100; j++)
{
for(int i = 0; i < 99; i++)
{
if (myList.GetAt(myList.FindIndex(i)) >
myList.GetAt(myList.FindIndex(i+1)))
{
myList.SwapElements(myList.FindIndex(i), myList.FindIndex(i+1));
}
}
}
// Order is: 0, 1, 2, 3...
ATLASSERT(myList.GetHead() == 0);
ATLASSERT(myList.GetTail() == 99);