对于100个元素,这些容器是什么:map,set,list,vector将占用最低的内存空间?换句话说,当我们将100个元素push_back到容器映射,set,list和vector时,哪个元素占用内存中的最小空间?例如sizeof(int)占用4Bytes,sizeof(short)占用2Bytes,问题是哪个容器占用的内存最低(内存的最低成本对我来说最重要)?提前谢谢。
答案 0 :(得分:2)
通常,缩小到适合vector
将具有任何序列容器的最小空间开销,因为除了少数指针和/或计数器之外,唯一的空间开销将是元素本身的空间(以及分配器使用的任何空间,对于您描述的STL容器,这是不可避免的)。 map
,set
和list
都为添加的每个元素提供了额外的指针。 (并且map
还需要保持键类型以及值类型。)为了迂腐,您实际上不能push_back
成set
或map
虽然你可以insert
加入它们。
另一方面,没有缩小到适合的vector
通常会过度分配大约1.5,但可能最多2次(对于某些实现可能更多)所需的空间,为了分摊附加费用,而list
,set
或map
等基于节点的容器通常不会。
如果这是一个问题,你可能会考虑deque
,它有一些单位开销(通常远小于每个元素一个指针),但对其过度分配有更严格的约束,赢得了' t随着序列的大小线性增长。
但是,容器的空间开销通常不是用于决定vector
,set
,list
或map
等容器的主要标准。使用模式的要求通常更为重要。例如,您是否需要能够在恒定时间内删除任意元素,或者不使迭代器或引用无效?如果是这样,vector
是不合适的。您是否需要能够插入/追加而不会使迭代器或引用无效?如果是这样,vector
是不合适的。您是否需要有效的查找(特别是与插入和删除混合)?如果是这样,list
是不合适的,vector
也可能不合适,除非重新排序序列对您的使用模式是可行的。你需要控制序列的顺序吗?如果是这样,map
和set
会为您重新排序元素,可能不合适。