集合类使用心得

转载 2007年09月21日 19:17:00

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根据索引找位置.
 

相关文章推荐

黑马程序员—13—java基础:有关集合类的学习笔记和心得体会

------- android培训、java培训、期待与您交流! ---------- 1. 为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对 ...

java集合类学习心得

java集合类学习心得 看了java从入门到精通的第十章,做个总结,图片均取自网络。 常用集合的继承关系 Linked 改快读慢 Array 读快改慢 Hash 两都之间 Collection是...

线程高级应用-心得8-java5线程并发库中同步集合Collections工具类的应用及案例分析

1.  HashSet与HashMap的联系与区别?    区别:前者是单列后者是双列,就是hashmap有键有值,hashset只有键;    联系:HashSet的底层就是HashMap,可...

MFC ODBC类使用心得

近日在使用MFC ODBC类进行一个数据库应用的开发,因为从没有用过MFC ODBC Class。在这上面费了不少精神。并且在CSDN和别的社区也看到不少新手在询问相关的问题,也为了让自己的解决掉的麻...
  • ergouge
  • ergouge
  • 2012年05月18日 19:07
  • 1122

Android 动画类使用心得

RotateAnimationfloat pivotX = mIvArrow.getWidth() / 2; float pivotY = mIvArrow.getHeight() / 2; mRot...
  • akongc
  • akongc
  • 2017年02月07日 00:24
  • 343

工具类apache.commons.lang.StringUtils 使用心得

转自 http://www.cnblogs.com/jifeng/archive/2012/08/05/2623767.html   在JAVA中我们用的最多的类应该就是String了。对于St...

C++使用SQLite3心得 -- sqlite3以二进制形式存取图片(MFC,CppSQLite3U封装类)

实现功能:1.将图片文件(.jpg)以二进制形式存储到sqlite3里面 2.从sqlite3里面读取二进制形式的图片数据并保存到图片文件(.jpg) *注:本人超级菜鸟 此博...

.net MVC4使用心得(二) Filter、EditorFor、通用类

继续谈今天遇到的各种问题       首先是使用Filter,利用框架自带的ValidateAntiForgeryTokenAttribute可以验证提交的表单是否从页面上来。具体实现机制是,在vi...

关于工作中使用RandomAccessFile类的心得

关于工作中使用RandomAccessFile类的心得随机访问类(RandomAccessFile) - 输入流FileInputStream和输出流 FileOutputStream,实现的是对磁盘...

OI心得::学会经常使用类,重载运算符和库。

前不久遇到了一道关于高精度的题,结果被虐的很惨。在这里,我对@snacking在湖南师大附中的洛谷团队上发布了这道题表示感谢。 在尝试解题的过程中我尝试了比较传统的基于过程的解决方案,结果30分;然...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:集合类使用心得
举报原因:
原因补充:

(最多只允许输入30个字)