c++ - 何时为键值数据选择 std::vector 而不是 std::map?

标签 c++

考虑到在主内存中搜索时缓存和数据局部性的积极影响,我倾向于使用 std::vector<>std::pair<> -喜欢键值项并对两者执行线性搜索,如果我知道键值项的总量永远不会“太大”而不会严重影响性能。

最近我遇到了很多情况,我事先知道我有大量键值项,因此选择了 std::map<>从头开始。

我想知道在上述情况下,您是如何决定使用合适的容器的。

你会吗

  • 总是使用std::vector<> (或类似)?
  • 总是使用std::map<> (或类似)?
  • 对项目计数范围内的哪一个比另一个更可取有直觉吗?
  • 完全不同的东西?

谢谢!

最佳答案

我很少将 std::vector 与线性搜索一起使用(除非与二进制搜索结合使用,如下所述)。我想对于足够小的数据量会更好,但是对于那么少的数据,任何东西都不太可能提供巨大的优势。

根据使用模式,在 std::vector 上进行二分搜索是有意义的。当您需要在使用过程中定期更新数据时,std::map 非常适用。然而,在相当多的情况下,您加载了一些数据,然后使用了这些数据——但在您加载数据之后,它大多保持静态(即,即使有变化,也非常小)。

在这种情况下,将数据加载到 vector 中、在必要时对其进行排序,然后对数据进行二进制搜索(例如 std::lower_boundstd::equal_range )非常有意义。这几乎提供了两全其美的优势——低复杂度的二进制搜索来自高引用位置的良好缓存使用(即, vector 是连续的,而不是 std::map 的链接结构) .缺点当然是插入和删除很慢——但这是我第一次使用你的原始想法——将新插入的数据单独存储,直到达到某个限制,然后才将其与其余数据一起排序数据,因此单个搜索包括对数据主体的二分搜索,然后是对(少量)新插入数据的线性搜索。

关于c++ - 何时为键值数据选择 std::vector 而不是 std::map?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2722442/

相关文章:

c++ - 如何为类型列表谓词创建 C++20 概念?

c++ - 对于 Boost.Propertytree,有什么方法可以使用 JSON 点符号来引用数组元素?

c++ - c中的类型提升和转换

C++——选择一组特征

.net - 不依赖 .net 的 Windows 安装项目

C++:模板参数循环依赖

c++ - 避免将转换运算符中的拷贝复制到基类的子集

c++ - 我不明白我遇到的 valgrind 错误

c++ - 运行 key 密码解密知道 key ?

c++ - Init() 的返回类型冲突