CList是一个双向链表类。CList的优势是快速灵活的插入和删除。但是在访问元素的时候,会多一个N的时间复杂度。在元素很多的时候,建议把数据分段存储。

1、包含头文件Afxtempl.h

在你要使用CList链表类的地方,使用#include  <Afxtempl.h>,或者直接在stdafx.h中包含这句。

2、理解CList的声明和构造方法

CList的声明如下:

template< class TYPE, class ARG_TYPE >

class CList : public CObject

CList的声明有2种方式,决定的是参数的使用是引用,还是复制。

例如:

CList<CString ,CString&> list1;        //注意引用符号的位置是在类型后面。<类型&>

CList<CString,CString> list2;

第一个参数,表示的是链表的元素的数据类型,这里类似一个声明,声明你使用的链表中的数据类型是什么。

第二个参数,分2种形式,一种是引用形式,一种是复制形式,那么这个引用和复制,体现的作用在哪里呢?其实,这个引用和复制,只是体现在元素的添加,查找上面。比如我们往刚才声明的这个链表list1中添加元素。

CList<CString ,CString&> list1; //

CString str = "abc";

list1.AddTail(str);              //str是以引用的方式,添加到list1中的,类似声明一个函数 void fun(CString &a);

再看另外一个中声明方式:

CList<CString,CString> list2;//

CString str = "abc";

list2.AddTail(str);             //str是以复制的方式添加的。

其实2种方式都能达到向链表中添加数据的目的,在数据结构很小的时候,其实是没有什么差别的,但是在数据结构很大的时候,比如一个数据元素就有1M,甚至10M,引用就变得有意义了,这个时候使用引用,链表是直接把str的地址中的内容添加到链表中了,使用复制,还需要先在内存中复制一下str,然后再把复制的内容添加到list中去。好了,现在懂了吗?如果没有,还得看下C++函数的形参的设置。是引用,还是非引用~

3、添加元素

  例如:CList<CStirng,CString&>  myList;

(1)在CList的尾部添加元素

POSITION AddTail( ARG_TYPE newElement );     //在尾部添加一个元素,返回值是新插入元素的位置

void AddTail( CList* pNewList );                                      //在尾部添加另一个链表中的内容。链表的数据类型要一致。

比如:myList.AddTail("abc");

(2)  在CList的头部添加元素

POSITION AddHead( ARG_TYPE newElement );       //在链表最开始插入一个元素,返回值是新插入的元素的位置

void AddHead( CList* pNewList );

例如:myList.AddHead(CString("ABC"));

(3)在一个位置之前添加元素

POSITION InsertBefore( POSITION position, ARG_TYPE newElement );      //在position前面插入一个元素,返回新插入元素的位置。其实就是position前面一个位置

例如:

POSITION pos = myList.GetHeadPostion();

pos = myList.InsertBefore(pos, CString("ABC"));

pos = myList.InsertBefore(pos, CString("123"));

(4)在一个位置之后添加元素

POSITION InsertAfter( POSITION position, ARG_TYPE newElement );       //在postion后面插入一个元素,返回新插入元素的位置

例如:

POSITION pos = myList.GetTailPostion();

pos = myList.InsertAfter(pos, CString("ABC"));

pos = myList.InsertAfter(pos, CString("123"));

4、     查找元素:CList有2个函数,是非常方便我们查找的。

       (1)直接查找元素

POSITION Find( ARG_TYPE searchValue, POSITION startAfter = NULL) const; 返回的是查找到的元素的第一个位置(如果链表中有多个重复的元素)。没有找到就返回空

例如:

CList<CString,CString&> myList;

myList.AddHead(CString("XYZ"));

myList.AddHead(CString("ABC"));

myList.AddHead(CString("123"));

POSITION pos = myList.GetAt(pos));

然后就可以通过pos来操作这个元素了。比如GetAt(pos),InsertAfter(pos)等。

(2)通过下标来查找位置,通过下标是非常方便的。

POSITION FindIndex( int nIndex ) const;           //返回第i个元素的位置,然后可以通过位置来对元素进行操作。

例如:

CList<CString,CString&> myList;

myList.AddTail(CString("XYZ"));

myList.AddTail(CString("ABC"));

myList.AddTail(CString("123"));

POSITION pos1 = myList.FindIndex(0);

POSITION pos2 = myList.FindIndex(2);

CString str1 = myList.GetAt(pos1);            //str1就等于"XYZ"

CString str2 = myList.GetAt(pos2);            //str2就等于“123”

CStirng str3 = myList.GetAt(myList.FindIndex(1));     //str3等于"ABC"

(3)遍历查找

//如果链表是const类型的,这些函数,返回的是一个复制元素,如果不是const的,返回的是链表中元素的引用。但是怎么设置成一个const类型的,我都还不知道。所以,一般我们使用这些函数得到的元素,都是引用的,可以直接对链表的元素复制:比如myList.GetHead() = "AAA";就能把表头置为"AAA"。

TYPE& GetHead( );                   //得到第一个元素,确保链表不为空,使用IsEmpty()

TYPE GetHead( ) const;         

TYPE& GetTail( );                     //得到表尾元素

TYPE GetTail() const;

TYPE& GetNext( POSITION& rPosition );                

TYPE GetNext( POSITION& rPosition ) const;

TYPE& GetPrev( POSITION& rPosition );

TYPE GetPrev( POSITION& rPosition ) const;

TYPE& GetAt( POSITION position );

TYPE GetAt( POSITION position ) const;

5、删除元素

(1)删除全部元素,删除后,链表为空。

void RemoveAll( );

例如: myList.RemoveAll();

(2)删除position处的元素

void RemoveAt( POSITIONposition );    //这里要保证position是有效的,不是空的,如果是空的,调试版本会报错。release版本不会报错。

例如:myList.RemoveAt(myList.FindIndex(1));

(3)删除表头

          TYPE RemoveHead( );                    //返回值是没有删除的时候的表头元素。

(4)删除表尾

TYPE RemoveTail( );                       //返回值是没有删除的时候的表尾元素。

6、链表的遍历

方式1:

POSITION pos = myList.GetHeadPostion();

while(pos != NULL)

{

CString  str = myList.GetNext(pos);                 //GetNext(pos),先返回pos位置的元素的值,再把pos指向当前位置的下一个。

}

方式2:

for(int i = 0 ; i < myList.GetCount(); i++)

{

CString str = myList.GetAt(myList.FindIndex(i));

}

总结:方式2,明显比方式1慢.方式1只需要执行N此就可以了,方式2,需要执行1+2+。。。+N = (1 + N)*N/2次

由于时间关系,写的也不是非常完整,需要这方面知识的,请多看MSDN帮助信息,祝你顺利~

最后还是请教一下大家,怎么把CList声明为const类型?欢迎留言~

CList的用法理解相关推荐

  1. oracle中start with和connect by的用法理解

    Oracle中start with和connect by 用法理解 转自:http://www.blogjava.net/xzclog/archive/2010/03/05/314642.html,多 ...

  2. python class用法理解_Python小世界:彻底搞懂Python一切皆对象!

    犹记得当初学习Python的时候,对于 Python一切皆对象 很是懵逼,因为Python是面向对象的动态型语言,而在函数及高阶函数的应用中,如若对于一切皆对象不是有很透彻的了解,基础不是那么牢固的话 ...

  3. python class用法理解_带你全面理解python中self的用法

    self代表类的实例,而非类. 执行结果如下 从上面的例子中可以很明显的看出,self代表的是类的实例.而self.class则指向类. self不必非写成self 把上面的代码改写一下. 改成thi ...

  4. c语言中do是什么用法,C语言基础知识:do while用法理解

    do while语句 与while类似,do while语句也同样是用于完成程序循环的一种方式,它的基本用法如下: do { //循环体 } while (条件表达式); 注意:do while语法与 ...

  5. QSettings用法理解

    对于QSettings类的用法和理解,网络上有很多讲解,这主要把自己用到QSettings类遇到的问题或者难以理解的部分进行标记.首次使用该类时,通过看帮助文档或者其他文章,最大的疑惑是QSettin ...

  6. SQL:EXISTS的用法理解(转)

    摘自:http://www.cnblogs.com/netserver/archive/2008/12/25/1362615.html 比如在Northwind数据库中有一个查询为 SELECT c. ...

  7. softmax(a,axis=0)的用法理解 总结

    对于3维度数组 总结axis=0 , 1 ,2 axis=0 沿着 axis=0方向 (可以认为是时间的方向)取每个单元对应元素进行计算softmax()  //通俗理解就是今天8点钟的对应行对应列的 ...

  8. python class用法理解_通过钢铁侠变身快速理解Python的装饰器用法

    1 一切都要从函数说起 我们都知道一个函数可以返回一些数据,然后这些数据可以被其他函数调用.函数里还可以有若干个参数,可以让函数根据不同的输入值进行不同的计算,然后得到新的结果. 于是,我们的故事就可 ...

  9. CList 简单用法

    首先来看微软原文 template< class TYPE, class ARG_TYPE = const TYPE& > class CList : public CObject ...

最新文章

  1. 提高项目执行力的六板斧
  2. 假设检验在数据分析中的应用
  3. web前端url传递值 js加密解密
  4. stream+springmvc实现文件断点续传
  5. IOC控制反转(依赖注入思想)
  6. 移动CRM的客户价值细分
  7. 容易被PHP程序员忽视的几个要点
  8. MySQL数据库(三)
  9. Laravel 5.4 api 允许跨域访问
  10. 【转】关于23种设计模式的有趣见解
  11. 宋宝华:谈一谈Linux写时拷贝(COW)的安全漏洞(1)
  12. 层次分析法(附实例)
  13. mac笔记本连接windows10共享打印机
  14. HTTP常见状态码 2xx 3xx 4xx 5xx
  15. 国产手机提价终遭受重大损失,降价的苹果反而逆势增长
  16. Message中obtain()与recycle()
  17. 关键路径法与关键链法区别
  18. [Power Query] 汇总表
  19. 八年级作文-倾听春雨的喜悦
  20. ros和carla的联合

热门文章

  1. 魔百盒CM211-1增强版2+16卡刷固件及教程
  2. Python 猴子吃桃问题
  3. 武忠祥每日一题-第1题
  4. webupload 上传图片后图片被压缩解决方法
  5. PMAC应用七-SDK的使用1
  6. Django 模板继承csrfToken原理
  7. Xss Bypass备忘录
  8. c#做动态(gif)中文验证码
  9. ant批量修改文件名_Ant Renamer|Ant Renamer(文件名批量改名软件)中文免费版v2.12 下载_当游网...
  10. c语言中二进制转十进制详解