C++ c++;轻型可附加阵列容器
这与我不久前提出的另一个问题有关。C++ c++;轻型可附加阵列容器,c++,arrays,stl,containers,C++,Arrays,Stl,Containers,这与我不久前提出的另一个问题有关。 基本上,我真的很想重新实现一个非常轻的容器,它允许添加项目(不管是在末尾还是在开头——不,它们在内存中不必是连续的……非常像列表)。不需要其他函数,只需追加,以及一个“count()”或“size()”函数来返回容器中的元素数,因此我可以循环遍历每个元素这是因为我创建了大量这样的容器,它们占用了大量内存空间(请参见我的另一个问题)。有人提出过这样的挑战吗?我环顾了一下web,发现大多数重新实现的STL容器对我来说仍然太大。我现在的想法是以某种方式重新编写最简单
基本上,我真的很想重新实现一个非常轻的容器,它允许添加项目(不管是在末尾还是在开头——不,它们在内存中不必是连续的……非常像列表)。不需要其他函数,只需追加,以及一个“count()”或“size()”函数来返回容器中的元素数,因此我可以循环遍历每个元素
这是因为我创建了大量这样的容器,它们占用了大量内存空间(请参见我的另一个问题)。
有人提出过这样的挑战吗?我环顾了一下web,发现大多数重新实现的STL容器对我来说仍然太大。我现在的想法是以某种方式重新编写最简单的(转发列表)STL容器,但我不是那种功夫,但我会试试。
谢谢您的时间。
Francesco我认为
std::vector
与容器一样轻。它只有恒定的开销,不为每个元素添加任何数据。可以看出,gcc对std::vector的实现占用了12个字节(在32位系统上)。你不会得到比这少得多的东西。多亏了这里所有的好输入。我最终将其缩减为以下内容:
1-下面是持有我的信息的班级:这里有填充的建议吗?浮点数=32位,+16+16+8+8+8时看起来正常。假设我可以在这里添加另一个8位元素,而不会导致额外的内存被使用,因为它会填充到32位块,这对吗 2-一个QList,每个单元格中都有一个指向我的度量类(1)的指针,因此大小为[rows*cols]:@mattfillips我将研究如何使用STD容器和@Angew可能转发_列表,而不是QList
typedef QList< WFM >* metricsP;
metricsP *mappedMetrics;
mappedMetrics = new metricsP[rows*cols];
typedef-QList*metricsP;
metricsP*mappedMetrics;
mappedMetrics=新的metricsP[行*列];
这应该会使它变小。稍后我将添加一些基准<谢谢大家抽出时间,非常感谢
欢迎任何附加评论。
Francesco通过基准测试,我不知何故发现QList
为什么会这样
QList< WFM > *qlist = new QList< WFM >();
WFM wfmobj;
wfmobj.fwhm2=5;
wfmobj.sens2=6;
wfmobj.fwhm=7;
wfmobj.sens=5;
wfmobj.nAmplitude=3;
qlist->append(wfmobj);
QList*QList=newqlist();
wfmobj;
wfmobj.fwhm2=5;
wfmobj.sens2=6;
wfmobj.fwhm=7;
wfmobj.sens=5;
wfmobj.nAmplitude=3;
qlist->append(wfmobj);
比记忆消耗更多
QList< WFM* > *qlist = new QList< WFM* >();
WFM *wfmobj = new WFM();
wfmobj->fwhm2=5;
wfmobj->sens2=6;
wfmobj->fwhm=7;
wfmobj->sens=5;
wfmobj->nAmplitude=3;
qlist->append(wfmobj);
QList*QList=newqlist();
WFM*wfmobj=新的WFM();
wfmobj->fwhm2=5;
wfmobj->sens2=6;
wfmobj->fwhm=7;
wfmobj->sens=5;
wfmobj->nAmplitude=3;
qlist->append(wfmobj);
????
也许我遗漏了什么。Erm,
std::vector
?数据结构占用的空间量主要取决于“容器”本身的大小。除非您更改容器,否则向其添加附加功能不会明显改变其占用的空间量。我不知道相对大小,但请查看QSet
。但是一般来说,我把Qt的容器放在STL容器中,没有回头看,特别是在C++11之后。@jrok是正确的:如果您想最小化空间(特别是如果您存储的每个项目都相当小,比如int
)向量通常比链表更可取。一个单链表在每个节点上都有一个指针,因此如果你存储int
s,那么存储指针的空间可能与存储你关心的数据的空间一样大(而一个双链表的指针空间可能是实际数据的两倍)。@JerryCoffin我存储的是一个包含六条短裤的小类,将来我可能会添加更多的东西,因此它比单个int大。我发布了一个带有讨论的答案。我肯定会从尝试std::vector
开始,但这也不是没有问题:随着项目的添加,重新分配(元素拷贝构造和销毁)在C++11之前的系统上可能会非常痛苦,不幸的是,这一点很重要,因为添加了很多东西@Angew我真的很喜欢“12字节”部分,我正在寻找这方面的参考资料。听起来很小。我将查看std::list占用了多少空间,这听起来很不错。@Francesco注意到std::list
为每个元素增加了2个指针的开销<代码>标准::转发列表
为每个元素添加一个指针。如果你关心内存占用,这些占用会很快累积起来(特别是当你的元素很小的时候)。@Francesco还注意到,如果你事先知道你将进行大量插入,并且你可以粗略估计插入的数量,你可以调用reserve()
,以消除重新分配的需要。@Angew-我可以大致估计每个容器中的点数
QList< WFM* > *qlist = new QList< WFM* >();
WFM *wfmobj = new WFM();
wfmobj->fwhm2=5;
wfmobj->sens2=6;
wfmobj->fwhm=7;
wfmobj->sens=5;
wfmobj->nAmplitude=3;
qlist->append(wfmobj);