-1

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

4

1 回答 1

2

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

另一方面,vector不适合收缩的 a 通常会被过度分配,通常在 1.5 左右,但可能高达所需空间的 2 倍(对于某些实现,可能更多),以分摊附加成本对它来说,而基于节点的容器,如list,setmap通常不会。

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

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

于 2013-04-19T00:25:20.520 回答