vc入门宝典(九)

集合类使用心得

何志丹

MFC提供集合类(Collect)专门负责数据对象的存储和管理,MFC的集合类分为三类,分别用于处理三类不同性质的数据结构:表(List,类似于数据结构的双链表),数组(Array)和映射(Map,具有类似字典的功能).

一,数组使用心得

原型: template< class TYPE, class ARG_TYPE > class CArray : public Cobject

简单地说是你输入的时候用ARG_TYPE类,输出的时候用TYPE,自动实现转换.

具体实现可以看c:/program files/microsoft visual studio/vc98/mfc/include/afxtempl.h.

如:

#include "afxtempl.h"//那个类需要那些头文件可以查看msdn,在类总括的最后

CArray<intchar>   Vars;

Vars.SetSize(3,1);

Vars.SetAt(0,'a');

int x= Vars.GetAt(0);

这种性质对于自定义类更有效,因为我可以通过重载”=”,来控制改化过程.

设置断点,我们会发现这个类有三个类成员:m_nSize,m_nMaxSize,m_nGrowBy,分别对应元素个数,已经开辟的空间,空间不足时,每次开辟的多少个元素的空间.

常见函数:

int GetSize( ) const得到m_nSize的值.

int GetUpperBound( ) const;数组的上界,m_nSize-1.

void SetSize( int nNewSize, int nGrowBy = -1 );三个类成员都会变,以前加的内容不一定丢失.

void FreeExtra( );整理多余的空间,使m_nMaxSize = m_nSize.

void RemoveAll( );删除全部元素.

TYPE GetAt( int nIndex ) const;得到第nIndex(从0开始)元素的值.

void SetAt( int nIndex, ARG_TYPE newElement ); nIndex不能越界.

const TYPE* GetData( ) const;将数据指针返回.

void SetAtGrow( int nIndex, ARG_TYPE newElement );和SetAt类似,如果过大,会开辟新空间.

int Add( ARG_TYPE newElement );加一个元素,m_nSize加一.

int Append( const CArray& src );//加上一个同类型的数组.

void InsertAt( int nIndex, ARG_TYPE newElement, int nCount = 1 );
void InsertAt( int nStartIndex, CArray* pNewArray );

TYPE& operator []( int nIndex );以c风格操作数组.

TYPE operator []( int nIndex ) const;

其它数组有:

CByteArray     支持字节数组.

CWordArray      支持字数组.

CDWordArray     支持双字节数组.

CObArray      支持COject类型指针数组.

CPtrArray       支持Void类型指针数组.

CUIntArray      支持无符号整形数组.

CStringArray    支持CString数组.

用法与上面基本一致.

                                二,  表使用心得

我以CStringList为例,谈一下使用表的心得.注意:查看MSDN,实际上看的是CObList,注意相应的类型改成CString,当然还有一些小差别,具体看vc的提示,最好安装vc_assist6.下面这个例子几乎用到这个类所有的函数.

 

         CStringList var(15);

         POSITION position;

         position =         var.InsertAfter(NULL,"item1");

         position =  var.InsertAfter(position,"item3");

         position =  var.InsertBefore(position,"item2");

 

         for( position = var.GetHeadPosition(); NULL != position ; )

                  AfxMessageBox(var.GetNext(position));

 

         for( position = var.GetTailPosition(); NULL != position ;var.GetPrev(position))

         {

                   CString str;

                   str = var.GetAt(position);

        

                  if("item3"==str)

                   {

                            var.RemoveAt(position);

                   }

                   else

                   {

                            str.MakeUpper();

                            var.SetAt(position,str);

                   }

        

         }

 

         var.RemoveHead();

         var.RemoveTail();

         var.RemoveAll();

        

         var.AddHead("he");

         var.AddTail("dan");

 

         position = var.Find("he");

         var.SetAt(position,"He");

        

         position = var.FindIndex(1);

         var.SetAt(position,"Dan");

//end        

下面是该类函数的简介.

POSITION InsertBefore( POSITION position, CObject* newElement );

POSITION InsertAfter( POSITION position, CObject* newElement );

在一个位置前或后插入一个新元素.

 

POSITION GetHeadPosition( ) const;

POSITION GetTailPosition( ) const;

获得头位置和尾位置.

CObject*& GetNext( POSITION& rPosition );

CObject* GetNext( POSITION& rPosition ) const;

CObject*& GetPrev( POSITION& rPosition );

CObject* GetPrev( POSITION& rPosition ) const;

获得后一元素或前一元素,注意rPosition会变.

CObject*& GetAt( POSITION position );

CObject* GetAt( POSITION position ) const;

根据位置得到元素.

void SetAt( POSITION pos, CObject* newElement );

根据位置设置元素.

void RemoveAt( POSITION position );

根据位置删除元素.

CObject* RemoveHead( );删除并返回头元素

CObject* RemoveTail( ); 删除并返回尾元素

POSITION AddHead( CObject* newElement );增加头元素
void AddHead( CObList* pNewList );在前面加一个表
POSITION AddTail( CObject* newElement );增加尾元素
void AddTail( CObList* pNewList );在后面加一个表
POSITION Find( CObject* searchValue, POSITION startAfter = NULL ) const根据元素值找位置.
POSITION FindIndex( int nIndex ) const根据索引找位置.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
写在前面 在我还在上学的时候,我选择了C++,最初我用VC6作为我的IDE,我看过很多本C++的教材,有的适合我,有的不适合我,其中有一本叫《Visual C++ 2005入门经典》的书帮了我不少的忙。因为通常的C++教材都只会介绍C++的语法什么的,很少会告诉我们如何去编译、运行,告诉我们什么是控制台程序,什么事Win程序,什么是GUI程序,C++能干什么,VC和C++的区别是什么。现在有很多的朋友应该也有这些问题吧? 学C++用C++也有几年了,算不上熟悉,算是初窥门径吧,我想我应该做点什么帮助一下那些和曾经的我一样困惑的朋友,特别是学生朋友,告诉他们他们所困惑的问题的答案。记得我学C++的时候,没有人教,有的时候也走了不少弯路,甚至连调试也不会,也不知道可以通过看调用堆栈看调用次序,还自己慢慢的去搜索,好傻啊。 接下来我会做一个《Visual C++ 2010入门教程》系列,用来帮助初学者。刚开始学的时候是很痛苦的,这个我深有体会,特别是身边还没有人能够指导一二的。内容主要涵盖在Windows下面使用C++进行开发的常见内容,Visual Studio 2010的使用,如何创建新项目,如何调试,如果配置项目属性等等,另外还会介绍Visual C++ 2010中新加如的一些内容,包括一些新的STL组建,一些新的语法支持等等。 由于本人水平有限,其中难免有错误,希望大家谅解,如果大家有发现问题还请务必及时指出来,否则误导了他人我就罪不容恕了。 注意,本教程非C++教程,不会教你C++,只会教你如何使用 Visual C++ 2010去练习去学习其它C++教材上面的程序。因此建议大家认真的去看其他的C++教程,在使用Visual C++ 2010实践的时候如果遇到问题可以到这里来参考。推荐《C++ Primer》、《C++程序设计语言》《Visual C++ 2008入门经典》

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闻缺陷则喜何志丹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值