C++将一组整数变量映射到值的有效方法
C++ efficient way to map a group of integer variables to values
为了将一组整数变量映射到值(假设我a1, a2, a3, a4, a5, a6
来确定一个值v
;这是一个类似于map<tuple<int, int, int, int, int, int>,VALUE_TYPE>
或map<struct{int, int, int, int, int, int},VALUE_TYPE>
的映射),我们可以使用
- 由整数作为键构造的字符串
- 元组作为键
- 结构或类作为键
- 等等...
我对这些方法的性能非常好奇。在我的情况下,
- 更少的插入,更多的查询
- 整数键分布范围广,但分布稀疏
- 时间更关心我,记忆更少
- 地图访问是最耗费的部分,因此即使是 10% 的加速也很重要
问题是哪种方式在我的情况下表现更好?
如果选择了结构键或类键,有什么技巧可以使比较器更有效率吗?
unordered_map更适合这种情况吗?我应该如何计算密钥的哈希?
我将非常感谢对解决方案的任何建议或评论。也欢迎就更普遍的情况进行讨论。提前谢谢。
基本上:实现不同的解决方案,编写性能测试程序并测量!
确实:
- 使用整数作为整数将比将它们转换为字符串更快。
- 结构(或类)应该比元组快(我的经验)。
- 还可以尝试
std::array<>
容器(也已经提供了运算符进行比较)。 - 哈希映射(
std::unordered_map<>
)比排序映射(std::map<>
)更快,但当然只有在不需要使用部分键搜索的情况下才能使用。
此外,如果您的数字相对较小并且一个键中有很多数字,请考虑实现 trie 数据结构。就像std::unordered_map
一样,这将允许您在l
是键的长度O(l)
时间内访问元素,但它也允许您按升序迭代抛出所有值并通过部分键查找值。这里的问题是您的内存消耗将与字母大小成正比(当然,您可以将内边缘存储在一些复杂的数据结构中,但这会对性能产生负面影响)。
相关文章:
- 使用std::函数映射对象方法
- 在C++中初始化向量映射的最有效方法
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 映射唯一值和重复值的有效方法.可以访问键或值的位置
- 将一系列数字映射到 CPP 中的值的简单方法
- 使用迭代器替换映射中的常量项的方法
- C++-将对象(如字符串)映射到表中成员函数的正确方法
- 在矢量中查找映射键的最快方法
- 遍历 STL 映射(集/多集)的最佳方法,同时元素可能会在循环期间被删除并重新插入?
- C 正确的方法来初始化和处理映射指针
- 消息映射如何与 SendMessage() 方法交互?
- 检查是否存在多维映射的元素的最快方法是什么
- 在映射最小值和最大值时从未签名转换为已签名的最佳方法?
- 处理对存储在私有映射中的值的封装访问的标准方法,而不破坏C++中的抽象
- 使用静态映射在C++中缓存数据的推荐方法是什么
- C++通过映射并使用中的方法从基类实现派生类
- C++将一组整数变量映射到值的有效方法
- 转换/映射方法最佳做法