对于 100 个元素,其中哪些容器:map、set、list、vector 将占用最低的内存空间?换句话说,当我们将 100 个元素 push_back 到容器 map、set、list 和 vector 时,其中哪一个会占用内存中的最低空间?例如 sizeof(int) 占用 4Bytes,sizeof(short) 占用 2Bytes,问题是这些容器中哪个占用的内存最低(最低的内存成本对我来说最重要)?提前致谢。
1 回答
通常,缩小以适应vector
将具有任何序列容器的最低空间开销,因为除了一些指针和/或计数器之外,唯一的空间开销将是元素本身的空间(以及分配器使用的任何空间) ,这对于您描述的 STL 容器来说是不可避免的)。 map
, set
, 并且list
都为每个添加的元素保存额外的指针。(并且 amap
还需要与值类型一起保存键类型。)要学究起来,您实际上不能push_back
进入 aset
或 a map
,尽管您可以insert
进入它们。
另一方面,vector
不适合收缩的 a 通常会被过度分配,通常在 1.5 左右,但可能高达所需空间的 2 倍(对于某些实现,可能更多),以分摊附加成本对它来说,而基于节点的容器,如list
,set
或map
通常不会。
如果这是一个问题,您可能会考虑deque
,它有一些单位开销(通常远小于每个元素一个指针),但对其过度分配有更严格的限制,它不会随大小线性增长序列。
但是,容器的空间开销通常不是用于决定容器(例如vector
、set
、list
或)的主要标准map
。使用模式的要求往往更为重要。例如,您是否需要能够在恒定时间内删除任意元素,或者不使迭代器或引用无效?如果是这样,vector
是不合适的。您是否需要能够在不使迭代器或引用失效的情况下插入/追加?如果是这样,vector
是不合适的。您是否需要有效的查找(尤其是与插入和删除混合)?如果是这样,list
是不合适的,并且vector
也可能不合适,除非重新排序序列对您的使用模式是可行的。您需要控制序列的顺序吗?如果是这样,map
并且set
将为您重新排序元素并且可能不合适。