集合类使用心得

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

Java集合框架官方教程(7):自定义集合类的实现

Lesson: Custom Collection Implementations Many programmers will never need to implement their own...
  • zhoudaxia
  • zhoudaxia
  • 2014年06月11日 10:08
  • 2307

一个类在另一个类中以集合形式声明为属性时应该注意的问题

标题:一个类在另一个类中以集合形式声明为属性时应该注意的问题,先解释一下,看下面的代码吧 [Serializable] public class MO_T_sj_quest ...
  • xuejunling
  • xuejunling
  • 2015年02月05日 15:21
  • 2381

集合类 AVA常用集合类功能、区别和性能

Collection接口主要有两种子类分别为List和Set,区别主要是List保存的对象可以重复,而Set不可以重复,而Map一般为key-value这样的对应关系,比如我们常用的HashMap。 ...
  • qq_33326449
  • qq_33326449
  • 2016年10月05日 22:37
  • 309

集合类接口的常用方法

Collection接口是层次结构中的根结口。构成Collection的单位,被称为元素。Collection接口通常不能直接使用,但该接口提供了添加和删除元素、管理数据的方法。...
  • gugaopeng19940928
  • gugaopeng19940928
  • 2017年08月07日 19:48
  • 230

java 集合详解及如何应用

作为Java工程师,你是否还在不明所以的运用Java集合,这篇文章让你对Java集合不再困惑,对它有一个深刻的了解...
  • hellothejava
  • hellothejava
  • 2017年06月19日 11:03
  • 708

C#常用集合的使用

大多数集合都在System.Collections,System.Collections.Generic两个命名空间。其中System.Collections.Generic专门用于泛型集合。 针对...
  • ceclar123
  • ceclar123
  • 2013年03月10日 13:16
  • 41698

Java集合类操作优化经验总结

本文首先针对 Java 集合接口进行了一些介绍,并对这些接口的实现类进行详细描述,包括 LinkedList、ArrayList、Vector、Stack、Hashtable、HashMap、Weak...
  • Gmarrylin
  • Gmarrylin
  • 2016年06月29日 17:30
  • 741

Java集合类Collections常用方法总结

public class CollectionsTest { public static void main(String[] args) { List list = new A...
  • wangshuang1631
  • wangshuang1631
  • 2016年11月17日 15:33
  • 2896

C#集合接口与集合类

C#开发经常用到.NET框架为我们提供的集合接口和集合类,接下来做一个总结,如有差错,希望各位大神指正。       首先是集合接口,自己画了一张图(嘿嘿,有点丑),来说明集合接口的继承关系。 ...
  • qb1688
  • qb1688
  • 2016年05月11日 00:43
  • 911

Python中的集合类型及其操作

本文介绍python中的集合类型以及其相关操作。 集合是一个无序的(字典也是无序的),不重复的数据集合。其基本功能包括下面两种: 1. 去重:把一个还有重复元素的列表或元组等数据类型转变成集合,其中的...
  • bbc955625132551
  • bbc955625132551
  • 2017年07月27日 10:34
  • 293
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:集合类使用心得
举报原因:
原因补充:

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