STL C++中的容器

Containers in STL C++

本文关键字:C++ STL      更新时间:2023-10-16

对于100个元素,map、set、list、vector中的哪个容器将占用最低的内存空间?换句话说,当我们将100个元素推到容器映射、集合、列表和向量中时,其中哪一个将占用内存中最低的空间?例如sizeof(int(占用4字节,sizeof(short(占用2字节,问题是这些容器中哪一个占用的内存最低(内存成本最低对我来说最重要(?提前谢谢。

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

另一方面,未收缩以适应的vector通常会被过度分配,通常在1.5倍左右,但可能高达所需空间的2倍(对于某些实现,可能更大(,以分摊附加到其上的成本,而基于节点的容器(如listsetmap(通常不会被过度分配

如果这是一个问题,您可以考虑deque,它有一些单位开销(通常每个元素不到一个指针(,但它的过度分配限制要严格得多,不会随着序列的大小线性增长。

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