vc入门宝典(九)

简介: 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<int,  char>   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_TYPEnewElement ); nIndex不能越界.

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

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

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

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

void InsertAt( int nIndex, ARG_TYPEnewElement, 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根据索引找位置.


相关文章
|
存储 编解码 Linux
FFmpeg+SDL播放器开发实践:解析、解码、渲染全流程详解
FFmpeg+SDL播放器开发实践:解析、解码、渲染全流程详解
|
人工智能 安全 API
AI战略丨MCP 生态发展:从技术标准到商业机遇的全景解析
在 AI 时代,成功不再仅仅取决于技术的先进性,更取决于生态的构建能力和标准的制定权。
AI战略丨MCP 生态发展:从技术标准到商业机遇的全景解析
|
4月前
|
存储 缓存 资源调度
# Qwen3-8B 与 ChatGPT-4o Mini 的 TTFT 性能对比与底层原理详解
Qwen3-8B 是通义实验室推出的80亿参数模型,支持32K上下文,采用FP8量化和CUDA优化,提升推理效率;ChatGPT-4o Mini 为OpenAI轻量模型,参数约3.8B,支持128K上下文,通过蒸馏技术实现低延迟。两者在TTFT、长文本处理和部署优化上各有优势,适用于不同应用场景。
746 9
|
运维 算法 应用服务中间件
运维系列.Nginx中使用HTTP压缩功能(一)
运维系列.Nginx中使用HTTP压缩功能(一)
422 1
|
JavaScript 前端开发 Java
Github 上 8 个很棒的 Vue 项目
Github 上 8 个很棒的 Vue 项目
625 0
|
前端开发 Java
在springboot项目中实现将上传的jpg图片类型转为pdf并保存到本地
使用uniapp的uni.canvasToTempFilePath方法,将canvas内容转为jpg并上传至服务器。后端接收到jpg文件后,通过Java的PDFBox库进行处理。代码包括:选取画板内容为jpg,转换为临时文件路径,基于此路径生成File对象并上传,服务器端利用PDFBox处理上传的jpg文件。依赖:PDFBox 2.0.8。
287 3
|
安全 Android开发 Kotlin
Android面试题之Kotlin协程并发问题和互斥锁
Kotlin的协程提供轻量级并发解决方案,如`kotlinx.coroutines`库。`Mutex`用于同步,确保单个协程访问共享资源。示例展示了`withLock()`、`lock()`、`unlock()`和`tryLock()`的用法,这些方法帮助在协程中实现线程安全,防止数据竞争。
332 1
|
存储 编解码 JavaScript
深度解析Qt背景设计:从基础到高级,从Widget到Quick(二)
深度解析Qt背景设计:从基础到高级,从Widget到Quick
815 0
|
数据采集 数据库 数据格式
【数学建模竞赛】数据预处理知识总结2——数据变换
【数学建模竞赛】数据预处理知识总结2——数据变换
244 1
|
存储 关系型数据库 MySQL
Linux——MySQL数据库部署及自建数据库mysql-yum仓库
我们耳熟能详的软件,包括游戏、淘宝各类软件APP,都会用到数据库,数据库存储的数据包括:用户的账号密码,用户的金额余额,以及购物的记录收藏记录,以及游戏的装备信息,等级信息等,只要是信息都会存储在数据库中。
485 0