使用collection classes的问题

lord_logic 2002-04-02 01:20:11
我刚学VC,在使用COLLECTION CLASSES的时候发现CArray CList 都支持动态生成,反而CMap 不支持,使用时还需要定义一个nBlockSize (MAP的最大数据量?)是我的理解错误吗?CMap 的原理是什么啊?另外有什么网站定期有好程序读?我读程序的能力太差了。
既然CArray 提供动态尺寸的功能,那它就不可能将全部的元素安排在一个连续的内存段中,不知道这样理解有没有错误,如果是这样的话,插入元素时就不应该在内存中移动元素,但是在MSDN中微软将CArray的插入速度定义为慢,这是为什么?
另外,我有一个需要提供dynamically sized功能的collection classes,它要求有快速的查找功能,而且插入的速度越快越好,好象CMap不提供dynamically sized的功能,这样的话使用顺序CArray的折半查找是否是最好的方法?
或者还有更好的方法,谢谢你告诉我。 :)
...全文
45 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
soarhigh 2002-04-03
  • 打赏
  • 举报
回复
默认Hash表大小为17个输入项;Microsoft建议将散列表的尺寸设置为比映射表所包含的项目的总数大百分之十到二十,可调用CMap.InitHashTable( );CMap有dynamically sized的能力是因为Hash表的一项指向一个CAssoc个结构体,而该结构体又指向一个具有同样Hash值的CAssoc结构体。所以具有动态生成能力。而Hash表的长度在初始化后是一定的。
若还不理解,给我你的email,发幅图给你,你就明白了。

在问题行中点击最右边的“管理”你就可以给分了。谢谢
lord_logic 2002-04-02
  • 打赏
  • 举报
回复
另外我不知道如何给你的帖子加分
你告诉我我马上加上去
lord_logic 2002-04-02
  • 打赏
  • 举报
回复
你说的内容我基本看懂了,谢谢
翻了一下STL中 Array的实现,大概是:
先分配一段空间, 并且把这段空间的中间作为数组的开始,这样你可以在两头插入元素, 而不需要重新分配空间, 一旦某一头的数组越界,它会分配一个更大的空间, copy这个数组到更大的空间中, 并且保持两头剩余差不多的元素空间, 每次增加的空间不是一定的,都是越来越! 大,这些都是被类封装了,用起来的时候不用考虑越界问题.
另外我还有问题:
如你所说,CMap是使用HASH表来实现,那么确定HASH函数时必须确定表长,而且通过HASH函数映射出的地址集应该是连续而且有限的,即CMap不具备dynamically sized的能力,但是MSDN又告诉我CMap有dynamically sized的能力,我不知道是如何实现的,可以说一下吗? :)
soarhigh 2002-04-02
  • 打赏
  • 举报
回复
CArray中,之所以可以动态调整尺寸,是因为
有数组A[3],你要把它调整到A[5],实际上是新开辟了一块内存,将原来的A[3]中的元素复制到新开的A[5]中的前三位去了。并不是在原来的A[3]末尾再添加一块可以存贮两个元素的内存区。
CMap的原理:MFC使用ACssoc结构来代表给映射表加入的项目。你要有Hash的知识就明白了。可参阅《MFC Windows 程序设计》

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧