CArray怎么用 ?

iProgram 2001-03-03 08:28:00
#include <afxtempl.h>
......
//In a function:
{
int i,nSize=3;
CArray<int,int> nAry;
nAry.SetSize(nSize);
for(i=0;i<3;i++)
nAry.Add(10);
for(i=0;i<3;i++)
afxDump<<nAry.GetAt(i);
}
//运行结果:
0
0
0
//我期待的结果是:
10
10
10
还有什么好的方法实现动态数组?CArray的对象需要我手工删除吗?
...全文
352 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
iProgram 2001-03-09
  • 打赏
  • 举报
回复
sunriselx 2001-03-07
  • 打赏
  • 举报
回复
他妈的,我也碰到过类似的问题,如果不能动态增长,我还不如用自己定义的数组呢,更快,用CArray干嘛?如果setsize()后进行频繁的removeat(),索引会混乱,getat()得不到想要的值,还得专门维护索引,真愚蠢,不如不setsize(),直接add(),宁可内存碎片了。
sunriselx 2001-03-07
  • 打赏
  • 举报
回复
他妈的,我也碰到过类似的问题,如果不能动态增长,我还不如用自己定义的数组呢,更快,用CArray干嘛?如果setsize()后进行频繁的removeat(),索引会混乱,getat()得不到想要的值,还得专门维护索引,真愚蠢,不如不setsize(),直接add(),宁可内存碎片了。
xyzboat 2001-03-07
  • 打赏
  • 举报
回复
CArray一族,这么一个好东东,我喜欢用的.

SetSize ();的第二个参数比较有意义,如果数组需要频繁的Add,倒不妨把 步长(我暂时这样理解)设长一点,效率明显要好.
如果本身数组并不大,无关紧要的了.
rediori 2001-03-07
  • 打赏
  • 举报
回复
用CDWordArray CArray 没有设置size的话 , 每添加一个就会重新分配一次
这样效率很低 。 如果设置了size , 当长度大于size时才会重新分配。
iProgram 2001-03-07
  • 打赏
  • 举报
回复
Thanx.Let me test test.
joke100 2001-03-05
  • 打赏
  • 举报
回复
哈哈,不好意思
把nAry.Add(10);改成nAry.SetAt(i, 10);即可.


先做了nAry.SetSize(10);以后再nAry.Add(10);意思是把新成员加在后面,你在上面代码最后加一句TRACE("nAry.GetSize() = %d\n",nAry.GetSize());,然后去查OUTPUT可以发现成员数目变成了20!!!

其实你说的这种情况不必要用模板,用CDWordArray就行了.
iProgram 2001-03-04
  • 打赏
  • 举报
回复
中午好,joke100,告诉你一个好消息,我试过了TRACE宏,同样无效,干脆:
CArray<int,int> nAry;
int i;
nAry.SetSize(10);
for(i=0;i<10;i++)
{
nAry.Add(10);
TRACE("%d\n",nAry.GetAt(i));
}
if(nAry.GetAt(5)==10)
MessageBox("Yes");
else
MessageBox("NO");
//结果是"NO"
iProgram 2001-03-03
  • 打赏
  • 举报
回复
Append是将另一个同类的CArray对象加到自己的末尾
//faint,还有比我跟倒霉的。
CandyCat 2001-03-03
  • 打赏
  • 举报
回复
找到啦SetSize():
建立一个空的或已存在数组的大小;如果必要,则分配内存。如果新的大小比以前的大小的话,则数组被截短并且所有未使用的内存被释放。在开始使用数组之前,使用此函数设置数组的大小。如果没有使用SetSize,则为数组添加元素就会引起频繁地重分配和拷贝。频繁地重分配和拷贝不仅无效率,而且会造成内存碎片。当数组正在扩张时,nGrowBy参数会影响内部地内存分配。正象GetSize和GetUpperBound提到地那样,它的使用不会数组大小。如果使用缺省值,则MFC分配内存会使用计算方法,避免内存碎片并加已优化,使之对大多数的情况都更有效率。
我原来还以为Append是追加数祖大小呢。。。
CandyCat 2001-03-03
  • 打赏
  • 举报
回复
那么,Append又有什么用呢?
iProgram 2001-03-03
  • 打赏
  • 举报
回复
不知道,可能Add一次就得重新分配,问TMD微软去。
MSDN上说最好用SetSize分配好空间,可是如果这样我还用什么CArray?后来我理解为当元素超过某个值,比如100,就SetSize(100)一次,最后再Free掉额外的部分。
还有个疑惑:到底有没有可能实现动态数组,数组要求内存连续,可是绝对和动态矛盾,要是MFC在后台使猫腻用个链表什么的虎偶,偶还不如直接用链表。
CandyCat 2001-03-03
  • 打赏
  • 举报
回复
我问个问题噢,如果你把nAry.SetSize(nSize);这句话删去会出现什么情况呢?
iProgram 2001-03-03
  • 打赏
  • 举报
回复
faint,头一次用afxDump代替TRACE,算我倒霉
iProgram 2001-03-03
  • 打赏
  • 举报
回复
MSDN上说当Carray对象的上界不够时,Add函数首先会扩大上界,也就是说无需new,是否如此?
joke100 2001-03-03
  • 打赏
  • 举报
回复
If you need a dump of individual elements in an array, you must set the depth of the CDumpContext object to 1 or greater.

上面是MSDN上的说明,问题应该出在afxDump<<nAry.GetAt(i);
也就是说仅是输出错误而已,建议使用TRACE输出即可,用TRACE1("%d\n", nAry.GetAt(i));

你提供的样例不是动态数组吧,这是使用程序的栈内存,在ARRAY内部存放的也不是在堆内存分配的对象,所以程序会自动清除不会有内存泄露的.

创建动态对象用new喽,在堆上分配内存,要由自己显式的删除对象

比如:
int i,nSize=3;
CArray<int*,int*&> nAry;
nAry.SetSize(nSize);
int* pElement = NULL;
for(i=0;i<3;i++)
{
pElement = new int(10);
nAry.Add(pElement); // 注意里面存放的是指针
}
....

// 最后要显式清除
for(i=0;i<3;i++)
{
if (pElement = (int*)nAry.GetAt(i))
delete pElement;
}
joke100 2001-03-03
  • 打赏
  • 举报
回复
If you need a dump of individual elements in an array, you must set the depth of the CDumpContext object to 1 or greater.

上面是MSDN上的说明,问题应该出在afxDump<<nAry.GetAt(i);
也就是说仅是输出错误而已,建议使用TRACE输出即可,用TRACE1("%d\n", nAry.GetAt(i));

你提供的样例不是动态数组吧,这是使用程序的栈内存,在ARRAY内部存放的也不是在堆内存分配的对象,所以程序会自动清除不会有内存泄露的.

创建动态对象用new喽,在堆上分配内存,要由自己显式的删除对象

比如:
int i,nSize=3;
CArray<int,int> nAry;
nAry.SetSize(nSize);
int* pElement = NULL;
for(i=0;i<3;i++)
{
pElement = new int(10);
nAry.Add(pElement); // 注意里面存放的是指针
}
....

// 最后要显式清除
for(i=0;i<3;i++)
{
if (pElement = (int*)nAry.GetAt(i))
delete pElement;
}

16,551

社区成员

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

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

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