【问题标题】:Efficient C++ associative container with vector key具有向量键的高效 C++ 关联容器
【发布时间】:2011-09-21 06:17:11
【问题描述】:

我已经构建了一个以向量为键的地图:map<vector<KeyT>, T>,我现在正在尝试对其进行优化。

手动嵌套映射map<vector<KeyT>, map<KeyT,T> > 的实验,其中第一个键是原始向量减去最后一个元素,第二个键是最后一个元素,显示了合理的加速。

现在我想知道是否存在关联容器的半标准实现(如 boost 或类似),其中向量键被实现为容器的这种层次结构。

理想情况下,这将创建与关键向量中的元素一样多的层,同时为不同长度的向量保持统一的语法。

【问题讨论】:

  • 使用 hash_map 可以提高访问性能
  • 请解释一件事,向量是如何成为键的?看起来相当复杂的逻辑。
  • @Alan Stokes,没错。我知道必须有一个词来形容它。
  • @DumbCoder:我想将 n-gram 与概率相关联。如果您知道任何更好的方法来做到这一点,请告诉我。 n-gram 不是由字符串组成,而是由自定义类组成,因为它们不代表单词。到目前为止,该类定义了 operator

标签: c++ vector map


【解决方案1】:

您确定需要优化它吗? std::string 基本上就像 std::vector 一样,我们很乐意使用 std::string 作为数组键!

您是否分析过您的代码? std::map 不会不必要地复制它的键/值对——你到底害怕什么?

你的向量键是固定大小的吗? std::tuple 在这种情况下可能会有所帮助。

如果不是这样,根据密钥的长度对容器进行分区可能会有所帮助,尽管此类方案的有效性高度依赖于域。

【讨论】:

    【解决方案2】:

    我的第一个预感是您想通过减少键的体积来缩短地图查找时间。这就是哈希函数的用途。 C++ tr1 和 Boost 有名为 unordered_map 的 hash_maps

    我会尝试在这里设计一个小样本

    【讨论】:

    • 听上去他想要在键上定义一个顺序——“向量键被实现为容器的层次结构”
    • 确实@spraff,层次结构的第一层应该按照向量的第一个元素排序,第二层按照向量的第二个元素排序。
    • 您可以省力。我可以自己想出一个 unordered_map 的玩具示例,但问题是向量键的元素是具有自定义类成员变量的自定义类,我想避免需要定义大量哈希函数(我已经有 operator
    • 是的,就像 Alan Stokes 建议的那样,我认为您正在寻找 Trie
    猜你喜欢
    • 2011-12-27
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    相关资源
    最近更新 更多