请教CStringArray的GetSize函数问题

白虹李李 2010-12-26 10:08:08
按照MSDN里讲的,使用CStringArray最好先调用SetSize函数进行初始化:
Note Before using an array, use SetSize to establish its size and allocate memory for it. If you do not use SetSize, adding elements to your array causes it to be frequently reallocated and copied. Frequent reallocation and copying are inefficient and can fragment memory.

可是调用了这个函数后GetSize的结果就不正确了。代码:
CString a1;
a1="abc";

CStringArray strArray;
//strArray.SetSize(50);
int index=strArray.Add(a1);
int count=strArray.GetSize();

如果没有strArray.SetSize(50);这句,那么执行下来index=0,count=1。
如果把注释去掉,执行下来index=32,count=33(可能各个机器根据情况不同?)

这个问题我是在另一段代码中发现的,当时也是类似的代码,执行下来插入第一个元素后index=1而不是我预期的0.然后调用GetSize为2,这样我循环处理就出问题了。
所以写了这段代码来做实验。

请教一下高手,这个是为什么啊?
...全文
1008 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2011-08-23
  • 打赏
  • 举报
回复
0x32=50
zhuoyue08 2011-06-21
  • 打赏
  • 举报
回复
数组类的CStringArray strArray;
strArray.SetSize(50);

for(int i=0; i<strArray.GetSize(); i++)
{
strArray.SetAt(i, a1);
}

for(int i=0; i<strArray.GetSize(); i++)
{
CString str = strArray.GetAt(i);
AfxMessageBox(str);
}





mxdzhangyang 2010-12-31
  • 打赏
  • 举报
回复
前面的空间怎么会浪费呢 。。你自己也说了是避免重复的拷贝以及内存分配所以才预先分配的。。你可以用SetAt为你预先分配的空间赋值啊 。。。
mxdzhangyang 2010-12-31
  • 打赏
  • 举报
回复
那只能说明你的编译器bug了 。。我自己也写了个小程序测试下。。。。不懂怎么在csdn上面发图片-_-..你还是不相信。。那么可以加我聊天工具我直接发图片或者直接调试给你看都可以
呵呵 。。原来可以把图片发到csdn你自己看吧
Eleven 2010-12-31
  • 打赏
  • 举报
回复

CStringArray strArray;
strArray.SetSize(50);

for(int i=0; i<strArray.GetSize(); i++)
{
strArray.SetAt(i, a1);
}

for(int i=0; i<strArray.GetSize(); i++)
{
CString str = strArray.GetAt(i);
AfxMessageBox(str);
}
白虹李李 2010-12-30
  • 打赏
  • 举报
回复
Note Before using an array, use SetSize to establish its size and allocate memory for it. If you do not use SetSize, adding elements to your array causes it to be frequently reallocated and copied. Frequent reallocation and copying are inefficient and can fragment memory.

按照这么说,使用SetSize只是为了预先分配空间,避免频繁的reallocation and copying啊
如果SetSize(50)会导致Add的从51开始,那么前面的50就浪费空间了?

这种说法很难理解。而且还有一个反证:
如果把注释去掉,执行下来index=32,count=33
我前面SetSize(50)的。而不是32.
hsgzr 2010-12-26
  • 打赏
  • 举报
回复
数组元素是从0开始的
dianhui 2010-12-26
  • 打赏
  • 举报
回复
看看CSDN上的解释:
ADD:
Adds an element to the end of the array; grows the array if necessary.
在数组的末尾增加一个元素,增加数组大小以满中需要。
而SetAt函数,CSDN给出的解释为:
Sets the array element at the specified index. SetAt will not cause the array to grow.
为数组设置一个元素到指定的索引位置上,SetAt不会改变数组的大小。

上面的解释很明白了,当你声明一个CStringArray变量时,如果不调用SetSize函数设定大小,那么该数组默认大小为0,所以你只能调用ADD函数为这个数组来增加原素,因为ADD会在该数据末尾增加一个新的元素,但如果你为CStringArray调用了Setsize进行初始化,那么我问一下你,此时的SetSize大小应该为你SetSize设定的大小了,假设你SetSize(10),此时数组变量的大小为多少?10对吧,该数组的尾部是索引为9的数组,如果你调用ADD为该数组再增加一个元素,那么该增加的元素的索引是多少?想想ADD是在尾部增加,其实索引应该为10了!
使用SetAt就不用我再说了吧!
mxdzhangyang 2010-12-26
  • 打赏
  • 举报
回复
ADD是在后面插入如果你调用setsize为数组指定了大小。。然后又调用了ADD他就会为在设置的大小上+1
为数组元素赋值应该调用SetAt 取值用GetAt 我是这么理解的。。。

16,472

社区成员

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

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

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