STL C++中的容器
Containers in STL C++
对于100个元素,map、set、list、vector中的哪个容器将占用最低的内存空间?换句话说,当我们将100个元素推到容器映射、集合、列表和向量中时,其中哪一个将占用内存中最低的空间?例如sizeof(int(占用4字节,sizeof(short(占用2字节,问题是这些容器中哪一个占用的内存最低(内存成本最低对我来说最重要(?提前谢谢。
通常,缩小以适应vector
的空间开销在任何序列容器中都是最低的,因为除了几个指针和/或计数器之外,唯一的空间开销将是元素本身的空间(以及分配器使用的任何空间,这对于您描述的STL容器来说是不可避免的(。map
、set
和list
都为添加的每个元素保持附加指针。(一个map
还需要包含一个键类型和值类型。(为了显得迂腐,你实际上不能将push_back
转换为set
或map
,尽管你可以将insert
转换为它们。
另一方面,未收缩以适应的vector
通常会被过度分配,通常在1.5倍左右,但可能高达所需空间的2倍(对于某些实现,可能更大(,以分摊附加到其上的成本,而基于节点的容器(如list
、set
或map
(通常不会被过度分配
如果这是一个问题,您可以考虑deque
,它有一些单位开销(通常每个元素不到一个指针(,但它的过度分配限制要严格得多,不会随着序列的大小线性增长。
然而,容器的空间开销通常不是用于在诸如vector
、set
、list
或map
之类的容器之间进行决定的主要标准。使用模式的要求往往更为重要。例如,您需要能够在恒定时间内删除任意元素,还是不使迭代器或引用无效?如果是,则vector
不合适。您需要能够在不使迭代器或引用无效的情况下插入/追加吗?如果是,vector
是不合适的。你需要高效的查找(尤其是插入和删除的混合查找(吗?如果是这样的话,list
是不合适的,vector
可能也不合适,除非重新排序序列对于您的使用模式是可行的。你需要控制顺序吗?如果是这样,map
和set
将为您重新排序元素,并且可能不合适。
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 在C应用程序中运行C++(带有STL)函数
- 使用2个键的cpp-stl::优先级队列排序不正确
- 在STL容器中使用模板类
- 用C++中的CPerson(类)类型的对象初始化STL矢量
- 将stl字符串缩小到小于15个字符的容量
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 检查函数返回类型是否与STL容器类型值相同
- STL算法函数在多个一维容器上的使用
- 在STL - C++中按成绩对学生列表进行排序?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- λ可以适应STL吗?
- 为什么使用 NDK 不能存在不同的 stl 实现?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 使用 char 分隔符解析C++中的字符串,但将可重复的字符保留为每个解析的子字符串 (C++ STL) 中的分隔符
- 在C++中迭代 STL 集时出现奇怪的问题<CStudent>
- 如何在 C++17 STL 并行算法中处理调度?
- 在学习数据结构之前对STL有一个了解是好的吗?
- C++ STL 排序会检查 NaN 吗?