C ++加倍唯一有序关系的索引向量

时间:2018-02-03 23:00:25

标签: vector hashmap mapping c++14 c++-standard-library

我正在寻找一个std样式容器,即使用迭代器等 结构如下:

template <hashable T, hasable U> class relationships {
    relation(std::[vector or list]<std::pair<T,U>> list);
    const std::pair<T,U>& operator [](const T index);
    const std::pair<T,U>& operator [](const U index);
}

这是用于双向映射,成对的顺序列表,T和U的每个值都是唯一的,并且两者都是可清除的,并且相关的T和U对具有特定的排序,这应该是通过以下循环重现

for (auto it : relationships) {
    // do something with it
}

等同于

for (auto it : list) {
    // do something with it
}

我也想要有效的查找,即operator [],应该等同于两种类型的std :: unorderd_map。

最后,我正在寻找基于标准库的解决方案,使用C ++ 14并且不想使用BOOST。

我曾经看过如何使用二进制搜索树实现Hash映射,但是我正在寻找有关如何有效维护两个索引加上有序元素或现有解决方案(如果存在)的结构的见解:

我目前的想法是使用

行的节点
template <typename T, typename U> struct node {
    std::pair<T, U> value; // actual value
    // hashs for sorting binary trees
    size_t hashT;
    size_t hashU;
    // linked list for ordering
    node * prevL;
    node * nextL;
    // binary search tree for type T lookup
    node * parentT;
    node * prevT;
    node * nextT;
    // binary search tree for type U lookup
    node * parentU;
    node * prevU;
    node * nextU;
}

然而,接缝效率低下

我的另一个想法是存储一个或多个有序的向量,然后是std::pair<size_t, size_t>的两个排序索引向量,第一个是哈希值,第二个是索引,但是我应该如何处理执行二进制文件搜索索引向量并处理哈希冲突。我相信这个解决方案会有更高的内存效率和类似的速度,但不确定所有的实现细节。

编辑:我不需要快速插入,只需查找和迭代,映射将生成一次,然后用于查找关系。

1 个答案:

答案 0 :(得分:0)

关于性能,这一切都取决于您尝试使用的算法和T和U的类型。如果您构建数据然后不进行更改,则可以使用以下简单解决方案:

  1. 使用vector<pair<T,U>>构建数据
  2. 复制此载体
  3. 根据T排序一个向量,根据U
  4. 排序
  5. 使用二进制搜索进行快速查找,如果按T查看,则在第一个向量中进行快速查找;如果按U查找,则使用二进制搜索进行快速查找
  6. 将所有这些隐藏在构造/排序/访问接口之后。您可能不想使用operator[],因为只有在排序
  7. 后才需要查看数据结构

    当然,在您复制数据的意义上,解决方案并不完美。但是,请记住,您将没有像使用hashmap那样额外的隐藏分配。例如,对于T = U = int,我认为没有比std::unordered_map更多的内存使用,因为每个节点都需要存储一个指针。