要使用的 STL 容器
Which STL Container to use?
如果出现以下情况,我应该使用哪个 STL 容器:
- 定期插入和删除数据。
- 定期随机访问数据。
例如:dataset(4,10,15( 如果我想找到最接近 9 的数字,那么它应该返回我 10。
- 我只存储一个整数。
- 它需要排序
- 可以转到 100k 数据集
我想过使用矢量,但矢量插入和删除很昂贵。
vector<int>
如果我要使用列表,我必须在访问数据之前访问 O(n( 元素。
list<int>
我正在考虑使用 set,因为如果对其进行排序会很好,但我不太确定使用 SET 的效率
所以我希望有人能给出一个好的解决方案!
我认为您应该检查此SO帖子: 在哪种情况下使用特定的 STL 容器? 对于小尺寸,无论您打算做什么,矢量都将适合大多数场景。
图表是一个指南,定期访问容器的事实不会影响容器的选择,除非你关心容器的大小,否则你存储int的事实并不重要,在这种情况下,列表容器或映射中指针的开销对你很重要吗?
排序由 map 自动完成,但如果容器大小足够小以适合内存,则对向量和列表进行排序可能会非常快。
数据插入针对容器中任何位置的列表和地图进行了优化,对于地图,您可以获得它自己排序的好处,但如果大小足够小,那么使用新条目构建新向量可能会非常快。
您可能还需要考虑哈希映射,您仍然最好分析您的代码,尝试猜测什么是最佳的取决于您的使用情况,并且您确实需要测量和分析。
您也可以决定 STL <map>
是一个足够好的平衡或<set>
并使用这些容器,因为它们会自动对插入和删除进行排序,并且查找速度很快,但维护每个条目中的指针会产生开销,与矢量相比,这会增加所用内存的大小, 如果你不关心这个,那么你可以考虑这些容器。
尽管如此,如果它很重要,然后测试、分析和比较每个容器的性能,你会惊讶于代码将如何根据你的假设执行。
如果要求只是性能,那么选择基本上应该始终是一个std::vector
。
它避免了基于节点的数据结构(树和列表(的许多内存分配,并利用空间局部性进行更高效的遍历。
当然,在向量中间插入/移除需要移动元素,但即使这样也很少足以使向量比其他数据结构慢。
我看到使用其他数据结构的唯一真正原因是:
-
std::map
/std::set
:这些都非常方便。很好且易于使用,因此,如果不需要最佳性能,我会在需要排序容器或键/值映射时使用它们。(为了获得最佳性能,排序向量可能更可取( - 所有其他容器:可能有用 正确性 保证在面对修改时的报价:向量经常重新分配并移动其内容,这使指针和迭代器无效进入向量。其他数据结构在那里提供了更强的保证(对于
deque
,指针保证在末端插入/删除后保持有效,但迭代器可能仍然无效。对于list
、set
和map
,指针和迭代器都保证在插入/删除期间保持有效(
当然,这些只是经验法则。
当涉及性能时,唯一普遍正确的规则是"自己进行基准测试"。我可以告诉你vector
在许多常见场景中通常如何表现,但我不能告诉你它在代码、编译器和标准库中的表现如何。因此,如果您担心性能,请对其进行衡量。尝试不同的替代方案,看看哪个更快。
一个集合足够高效,可以插入/删除/访问,并且它总是被排序的。 唯一要考虑的是集合中的条目是常量(因此顺序不会中断(,因此要进行更改,您应该删除,更新和插入
您的问题的答案完全取决于您的数据集大小,随着列表增长到巨大的大小,进行线性遍历以到达您需要删除/插入的元素所需的时间远远超过向量进行删除/插入所需的时间。因此,如果你的数据集很小,那就用列表,如果数据集很大,就用矢量。
如果需要排序,请使用二叉搜索树
- 在STL容器中使用模板类
- 检查函数返回类型是否与STL容器类型值相同
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 对象 C++ 向量的 STL 容器
- 如何在不破坏现有应用程序的情况下更改 API 中 stl 容器的数据类型?
- 在 STL 容器的 STL 容器上调用 clear
- "迭代器"和"const_iterator"不是 STL 容器的必需成员?
- 删除包含包含动态对象的 STL 容器的智能指针
- C++:在子类中扩展静态 STL 容器/映射成员?
- ostream 运算符<< 为获取 STL 容器而过载,传递 std::string 会破坏它?
- 没有 STL 容器的迭代器
- 为什么某些 STL 容器(堆栈、队列、优先级队列)不支持迭代器?
- 接受任何 STL 容器的函数
- C++ STL 容器中优先级搜索的优雅方法
- 我们如何打印出C++ STL 容器的value_type?
- 获取嵌套 stl 容器的大小(以字节为单位)
- 如何在C++中重新实现包含指针的 STL 容器的类的迭代器
- 迭代器和 STL 容器的关系
- 如何用索引增量generate_n填充STL容器