c++的函数需要返回数组,但是长度不定,应该怎样书写代码?

返回值的长度可能很大,也可能很短。但是在函数里面能够以【常数级】复杂度【先计算出】返回值的长度。(注意!【仅】在函数里面能这样计算,函数外面算不出来)我希望不要浪费空间,... 返回值的长度可能很大,也可能很短。
但是在函数里面能够以【常数级】复杂度【先计算出】返回值的长度。(注意!【仅】在函数里面能这样计算,函数外面算不出来)
我希望不要浪费空间,并且要保证缓冲区的大小足够
要求返回的结果能够随机访问

(以int为例)

不要用std::vector<int>,因为大小比实际略大,空间上有浪费;
不要用std::list<int>,因为不能随机访问

我不希望使用的写法:
int result[MAX_SIZE];//先分配一个缓冲区
int actualSize;
void Func(int *pRet, int maxSize, int *pActualSize){……}
Func(result, MAX_SIZE, &actualSize);
不希望这样写的原因:我已经说过长度不定,所以MAX_SIZE可能仍然不够用(很严重的问题),也可能浪费许多空间(可能是较严重的问题,有可能是小问题)。

下面这种写法可以实现,但是每次重新分配内存比较慢。能不能优化?
int *pRet Func(int *pActualSize)
{
int size = countSize();//我说过,【能且只能】在函数里面算出返回值的大小

int *pRet = new int[size];

*pActualSize = size;
return pRet
}
int *pInfo = Func(&size);
//使用pInfo和size
delete []pInfo;

下面这种方法虽不用重新分配,但是有点浪费空间
思路:每次复用缓冲区,直到不够时再重新分配;如果缓冲区空闲太多,也重新分配
/*全局变量*/
int *g_pBuf = NULL;
int g_size = 0;
void Func(int *pActualSize)
{
int size = countSize();

g_size < size://缓冲区不够
g_pBuf = realloc……

g_size > ½size //缓冲区的一半都空闲了
g_pBuf = realloc……
……
}

各位怎么看?在必须保证空间足够的前提下,应该怎样权衡相关因素?怎样书写代码?
展开
 我来答
正常人1号
2014-08-16 · TA获得超过1086个赞
知道小有建树答主
回答量:175
采纳率:0%
帮助的人:170万
展开全部
我认为这应该根据需求而定,如果需求内存的任务需要被频繁进行,那么建议还是采用“复用缓冲区直到不够再重新分配”的方法,否则每次都开辟,浪费时间(而且我认为缓冲区一半空闲就重分配有一点大题大做)。如果需求内存的任务只调用少数几次,用完就释放内存不失为一个更好的方法。
WM_THU
2014-08-16 · TA获得超过7164个赞
知道大有可为答主
回答量:4285
采纳率:80%
帮助的人:3950万
展开全部

我的建议是题主不要在函数没有实现之前就担心这么多问题。

  1. 这种内存分配的问题是从计算机出现以来就一直在被研究的,题主不太可能短时间内想到什么创新的策略。

  2. 我认为比较好的一种工程思路是,当问题出现了以后再去解决。如果题主没有在实际中遇到问题,就先暂时不用费这么多脑筋。

追问
我已经遇到问题了。我只不过是把和具体情境无关的东西抽象出来再问
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
射手hjt520
2014-08-16
知道答主
回答量:13
采纳率:0%
帮助的人:1.7万
展开全部
是的 没错 我也不知道 只是做任务
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式