Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;轻型可附加阵列容器_C++_Arrays_Stl_Containers - Fatal编程技术网

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更好

为什么会这样

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);