带STL的哈希列表 - 我可以将STL列表中的项目指向另一个项目吗?

时间:2011-12-23 18:26:21

标签: c++ stl

假设我有一个:

std::vector<std::list<Node> >

让我们说节点是:

class Node { 
    Node* next;
    int data;
};

矢量单元格对应于快速查找的哈希函数值。您的想法是将元素插入向量,但仍然将它们与Node-&gt;链接在一起。下一个成员。因此,您有一个列表,可以使用哈希函数通过键有效地查找元素,以找到正确的向量单元格。

无论如何,一切都放在一边。我的问题是:

我可以让我的Node :: next指针指向列表中的其他节点(无论是同一个节点,还是来自不同矢量单元的另一个节点)而不会导致问题?我不确定列表的标准库实现是否允许这样做。我似乎遇到了问题(我的代码在这里无法访问),我想知道这是否可能是原因。

2 个答案:

答案 0 :(得分:1)

STL列表是双重链接的,并且具有私有的上一个和下一个指针。元素中的下一个指针与列表的下一个指针无关,因此它可以是您想要的任何内容。你必须自己管理它。看起来你正在实现一个带有哈希冲突链表的哈希(clippy说)。你看过地图容器了吗?

答案 1 :(得分:1)

如果你想让它指向列表中的其他节点,那是完全可行的,是的。但是,我会提出一个不同的设计:std::list<int>std::unordered_map<int, std::list<int>::iterator>,这两个成员的唯一目的是保持两个容器同步。这比你当前的计划(我的解释)更容易,更安全,更快。

在两个列表中添加和删除对象都很简单:

std::unordered_map<int, std::list<int>::iterator> fast;
std::list<int> linked;

void add(int data) {
    fast[data] = linked.insert(linked.end(), data);
};
std::list<int>::iterator erase(std::list<int>::iterator iter) {
    fast.erase(*iter);
    return linked.erase(iter);        
}