STL C++ 中的容器 [关闭]

Posted

技术标签:

【中文标题】STL C++ 中的容器 [关闭]【英文标题】:Containers in STL C++ [closed] 【发布时间】:2013-04-18 22:42:08 【问题描述】:

对于 100 个元素,其中哪些容器:map、set、list、vector 将占用最低的内存空间?换句话说,当我们将 100 个元素 push_back 到容器 map、set、list 和 vector 时,其中哪一个会占用内存中的最低空间?例如sizeof(int) 占用 4Bytes,sizeof(short) 占用 2Bytes,问题是这些容器中哪个占用的内存最低(最低的内存成本对我来说最重要)?提前致谢。

【问题讨论】:

我的猜测?集合或向量。不需要键或指针,只需要值和内存。如果有重复,则设置获胜。 元素是唯一的还是可能重复的? map,什么是key,什么是value? 你的意思是哪个会有更多的元素,或者哪个容器会有更大的开销? 好吧,我建议使用矢量。顺便说一句,如果您已经知道有多少元素,为什么还要使用 STL。如果是这种情况,请使用简单数组。 @JesusRamos:您建议如何查找容器的确切空间? 【参考方案1】:

通常,缩小以适应 vector 的空间开销是任何序列容器中最低的,因为除了一些指针和/或计数器之外,唯一的空间开销将是元素本身的空间(以及分配器使用的任何空间,这对于您描述的 STL 容器来说是不可避免的)。 mapsetlist 都为每个添加的元素保存额外的指针。 (map 还需要与值类型一起保存一个键类型。)为了迂腐,你实际上不能将push_back 转换为setmap,尽管你可以insert进入他们。

另一方面,未收缩以适应的vector 通常会被过度分配,通常约为 1.5,但可能会达到所需空间的 2 倍(对于某些实现,可能更多),以便以摊销附加到它的成本,而基于节点的容器,如 listsetmap 通常不会。

如果这是一个问题,您可以考虑deque,它有一些单位开销(通常远小于每个元素一个指针),但对其过度分配有更严格的限制,不会增长与序列的大小成线性关系。

但是,容器的空间开销通常不是用于在 vectorsetlistmap 等容器之间做出决定的主要标准。使用模式的要求往往更为重要。例如,您是否需要能够在恒定时间内删除任意元素,或者不使迭代器或引用无效?如果是这样,vector 是不合适的。您是否需要能够在不使迭代器或引用失效的情况下插入/追加?如果是这样,vector 是不合适的。您是否需要有效的查找(尤其是与插入和删除混合)?如果是这样,list 不合适,vector 也可能不合适,除非重新排序序列对您的使用模式是可行的。您需要控制序列的顺序吗?如果是这样,mapset 将为您重新排序元素,并且可能不合适。

【讨论】:

以上是关于STL C++ 中的容器 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

小白学习C++ 教程二十一C++ 中的STL容器Arrays和vector

复习笔记——C++中的容器(STL容器)

C++中STL学习笔记——容器之vector

C++中STL学习笔记——容器之vector

FastMM 报告 C++ Builder 6 中 STL 容器的内存泄漏

小白学习C++ 教程二十二C++ 中的STL容器stackqueue和map