在C++数据结构中,经常会使用到CArray串和CMap映射,本文重点介绍其使用方法和相互之间的转换。

1.CArray使用

//数据结构定义
struct tMY_CAN_SIG
{CString    sSigName;CString    sSigDes;tMY_CAN_SIG(){sSigName  =  _T("");sSigDes        =  _T("");}tMY_CAN_SIG& operator = (tMY_CAN_SIG& item){sSigName =  item.sSigName;sSigDes       =  item.sSigDes;return *this;}
};
typedef CArray<tMY_CAN_SIG, tMY_CAN_SIG&> CMyCanSigArray;struct tMY_CAN_MSG
{DWORD  dwMsgID;CString sMsgName;CString    sMsgDes;CMyCanSigArray  arrSignal;tMY_CAN_MSG(){dwMsgID     =  0;sMsgName  =  _T("");sMsgDes        =  _T("");arrSignal.RemoveAll();}tMY_CAN_MSG& operator = (tMY_CAN_MSG& item){dwMsgID        =  item.dwMsgID;sMsgName   =  item.sMsgName;sMsgDes       =  item.sMsgDes;arrSignal.RemoveAll();int cnt = item.arrSignal.GetSize();for (int i=0; i<cnt; i++){arrSignal.Add(item.arrSignal[i]);}return *this;}
};
typedef CArray<tMY_CAN_MSG, tMY_CAN_MSG&> CMyCanMsgArray;//数据使用
CMyCanMsgArray  m_arrMyCanMsg;//循环
int cnt = m_arrMyCanMsg.GetSize();
for (int i=0; i<cnt; i++)
{int jcnt = m_arrMyCanMsg[i].arrSignal.GetSize();for (int j=0; j<jcnt; j++){m_arrMyCanMsg[i].arrSignal[j].sSigName;}
}

2.CMap使用

//数据结构定义
struct tMY_CAN_SIG_MAP
{UCHAR ucSigEditID;tMY_CAN_SIG DbSig;tMY_CAN_SIG_MAP(){ucSigEditID  =  0;}tMY_CAN_SIG_MAP& operator = (tMY_CAN_SIG_MAP& item){ucSigEditID = item.ucSigEditID;DbSig = item.DbSig;return *this;}
};struct tMY_CAN_MSG_MAP
{WORD    wMsgEditID;DWORD   dwMsgID;CString sMsgName;CString    sMsgDes;CMap<UCHAR, UCHAR&, tMY_CAN_MSG_MAP, tMY_CAN_MSG_MAP&> mapSig;tMY_CAN_MSG_MAP(){wMsgEditID  =   0;dwMsgID        =  0;sMsgName  =  _T("");sMsgDes        =  _T("");mapSig.RemoveAll();}tMY_CAN_MSG_MAP& operator = (tMY_CAN_MSG_MAP& item){wMsgEditID  =   item.wMsgEditID;dwMsgID      =  item.dwMsgID;sMsgName   =  item.sMsgName;sMsgDes       =  item.sMsgDes;mapSig.RemoveAll();POSITION pos = item.mapSig.GetStartPosition();UCHAR ucSigEditID = 0;tMY_CAN_SIG_MAP mapDbSig;while(pos){item.mapSig.GetNextAssoc(pos,ucSigEditID,mapDbSig);mapSig.SetAt(ucSigEditID,mapDbSig);}return *this;}
};//数据使用
CMap<WORD, WORD&, tMY_CAN_MSG_MAP, tMY_CAN_MSG_MAP&> m_MyCanMsgMap;//循环
WORD wMsgEditID = 0;
UCHAR ucSigEditID = 0;
tMY_CAN_MSG_MAP mapmsg;
tMY_CAN_SIG_MAP mapsig;
POSITION pos = m_MyCanMsgMap.GetStartPosition();
while(pos)
{m_MyCanMsgMap.GetNextAssoc(pos,wMsgEditID,mapmsg);POSITION pos1 = mapmsg.mapSig.GetStartPosition();while(pos1){mapmsg.mapSig.GetNextAssoc(pos1,ucSigEditID,mapsig);mapsig.DbSig.sSigName;}
}//查找
if (m_MyCanMsgMap.Lookup(wMsgEditID,mapmsg))
{if (mapmsg.mapSig.Lookup(ucSigEditID,mapsig)){m_MyCanMsgMap[wMsgEditID].mapSig[ucSigEditID];}
}

3.相互转换

//CMap和CArray数据转换
void ArrayToMap()
{m_MyCanMsgMap.RemoveAll();tMY_CAN_MSG_MAP msgmap;tMY_CAN_SIG_MAP sigmap;int cnt = m_arrMyCanMsg.GetSize();for (int i=0; i<cnt; i++){msgmap.wMsgEditID = WORD(i);msgmap.dwMsgID =  m_arrMyCanMsg[i].dwMsgID;msgmap.sMsgName    =  m_arrMyCanMsg[i].sMsgName;msgmap.sMsgDes    =  m_arrMyCanMsg[i].sMsgDes;msgmap.mapSig.RemoveAll();int jcnt = m_arrMyCanMsg[i].arrSignal.GetSize();for (int j=0; j<jcnt; j++){sigmap.ucSigEditID = UCHAR(j);sigmap.DbSig = m_arrMyCanMsg[i].arrSignal[j];msgmap.mapSig.SetAt(sigmap.ucSigEditID,sigmap);   }m_MyCanMsgMap.SetAt(msgmap.wMsgEditID,msgmap);}
}void MapToArray()
{m_arrMyCanMsg.RemoveAll();tMY_CAN_MSG msg;tMY_CAN_SIG sig;POSITION pos = m_MyCanMsgMap.GetStartPosition();WORD wMsgEditID = 0;tMY_CAN_MSG_MAP mapDbMsg;while(pos){m_MyCanMsgMap.GetNextAssoc(pos,wMsgEditID,mapDbMsg);msg.dwMsgID = mapDbMsg.dwMsgID;msg.sMsgName = mapDbMsg.sMsgName;msg.sMsgDes = mapDbMsg.sMsgDes;msg.arrSignal.RemoveAll();POSITION pos1 = mapDbMsg.mapSig.GetStartPosition();UCHAR ucSigEditID = 0;tMY_CAN_SIG_MAP mapDbSig;while(pos1){mapDbMsg.mapSig.GetNextAssoc(pos1,ucSigEditID,mapDbSig);sig = mapDbSig.DbSig;msg.arrSignal.Add(sig);}m_arrMyCanMsg.Add(msg);}
}

CArray和CMap使用相关推荐

  1. CArray CList CMap 插入与遍历效率对比

    前言:程序中经常用到不定量数组,选择上可以使用CArray,CList,CMap,而这三者插入及遍历的效率,未测试过,随着数据量越来越大,需要做程序上的优化,于是比较下三种类型的插入盒遍历的效率. 一 ...

  2. vc自定义CArray和CMap

    本文迁移自本人网易博客,写于2013年5月6日 typedef CArray<CString, CString&> CArrStr; 首先必须包含头文件<afxtempl.h ...

  3. C++MFC编程笔记day01 MFC介绍、创建MFC程序和重写消息处理

    一.MFC概念和作用 1.全称Microsoft Foundation Class Library,我们称为微软基础类库,封闭了绝大部分的win32 Api函数,C++语法中的数据结构,程序的执行流程 ...

  4. c语言运行可以微信直接打开吗,如何用软件visual+c+++直接打开已将创建好的MFC工程文? 爱问知识人...

    这是我的回答,希望对你有帮助. 楼主应该打开过 VC 这个软件吧,你可以看一下新建工程的时候,有好多项目类型可以选择,例如,win32应用程序,win32控制台,MFC应用程序等等,所以 VC 只是一 ...

  5. MFC界面编程基础(00):基本概念

    下一篇:MFC界面编程基础(01):Windows 编程模型 MFC:微软基础类库(英语:Microsoft Foundation Classes,简称MFC) 如果你是在windows平台上做GUI ...

  6. MFC容器MFC中容器类的使用

    对于MFC中所提到的基本容器类,做一个基本的介绍和编程操作. 如有数据结构基础,可以直接看第四部分对容器类的操作. 第一,MFC提供三种基本的容器类:arrays(数组), lists(链表), ma ...

  7. Cmap和Carray以及Cstring的使用以及MFC中的文件读写

    参考资料:百度文库http://wenku.baidu.com/view/ddd1b32558fb770bf78a55a5.html?from=search http://wenku.baidu.co ...

  8. MFC中动态数组CArray的使用

    MFC中动态数组CArray的使用 2010-04-27 10:21 数组--这个C语言中的怪物,自从被直接继承到C++中,便让无数有识之士们前赴后继.绞尽脑汁,试图寻找一种可以动态增长的替代数据类型 ...

  9. CMap如何使用,如何实例化?

    昨天,去CSND论坛看有人在问,关于CMap的用法,由于平时能用到,感觉的确非常好,很有用. 就在百度空间找到了有关CMpa使用的文章,我把两篇文章整合了. (一)<CArray,CList,C ...

最新文章

  1. 【转】人脸识别功能的用户体验设计优化
  2. filebeat启动多个_【翻译】Filebeat相关(一)
  3. python查看函数定义_从函数内函数定义看python的函数实现
  4. Java_案例实例2.约瑟夫环问题
  5. git 快速入门笔记
  6. js的规范写法ES5(自己以后按照这样写)
  7. Page 和Ability之间区别
  8. FlasCC例子研究之hellointerop
  9. 小白也会用的SQL优化工具推荐
  10. 韩顺平java作业题_韩顺平java作业
  11. python自回归_【时间序列】自回归模型
  12. 在本地计算机无法启动uGs,SIEMENS_NX 免安装版
  13. 【转】用万兆网卡测试超五类网线传输速度,颠覆你的认知
  14. HarmonyOS:ListContainer实现表格
  15. 详解OpenCV的椭圆曲线点坐标近似计算函数ellipse2Poly()
  16. 市场调研—全球及中国活化部分凝血活酶时间测试(APTT测试)行业研究及十四五规划分析报告
  17. 声学的一些基本知识(1)
  18. 《多媒体在初中数学中的运用研究》课题研究活动记录
  19. 2023 年值得关注的十大人工智能趋势,还不快码住来看!
  20. 【Web技术】1348- 聊聊水印实现的几种方式

热门文章

  1. oracle -- Oracle初始化参数详解
  2. Oracle 10.2 概念 第一章 Oracle介绍
  3. 软件工程工作量评估中的ILF,EIF,EI,EO,EQ术语解释
  4. 2022-08-01 零基础吉他入门知识(二) 吉他上的十二平均律,给吉他调弦,规范化弹吉他:节拍器,持琴姿势和拨弦手势
  5. JS正则表达式 ,reg.test()时,慎重全局查找/.../g属性
  6. CH340T制作STC51单片机下载器
  7. 甲骨文服务器保活脚本(Oracle keep alive)
  8. Ubuntu18.04 LTS 屏幕顶部状态栏设置同时显示日期和时间
  9. 一种基于计算机网络的流媒体,基于网络计算机的流媒体播放器的研究与实现.pdf...
  10. iOS textField属性详解