STL C ++中的容器

时间:2013-04-18 22:42:08

标签: c++ c++11 stl containers

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

1 个答案:

答案 0 :(得分:2)

通常,缩小到适合vector将具有任何序列容器的最小空间开销,因为除了少数指针和/或计数器之外,唯一的空间开销将是元素本身的空间(以及分配器使用的任何空间,对于您描述的STL容器,这是不可避免的)。 mapsetlist都为添加的每个元素提供了额外的指针。 (并且map还需要保持键类型以及值类型。)为了迂腐,您实际上不能push_backsetmap虽然你可以insert加入它们。

另一方面,没有缩小到适合的vector通常会过度分配大约1.5,但可能最多2次(对于某些实现可能更多)所需的空间,为了分摊附加费用,而listsetmap等基于节点的容器通常不会。

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

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