假设我有一个:
std::vector<std::list<Node> >
让我们说节点是:
class Node {
Node* next;
int data;
};
矢量单元格对应于快速查找的哈希函数值。您的想法是将元素插入向量,但仍然将它们与Node-&gt;链接在一起。下一个成员。因此,您有一个列表,可以使用哈希函数通过键有效地查找元素,以找到正确的向量单元格。
无论如何,一切都放在一边。我的问题是:
我可以让我的Node :: next指针指向列表中的其他节点(无论是同一个节点,还是来自不同矢量单元的另一个节点)而不会导致问题?我不确定列表的标准库实现是否允许这样做。我似乎遇到了问题(我的代码在这里无法访问),我想知道这是否可能是原因。
答案 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);
}