这个问题已得到解答,因此下面的内容解释了我想要实现的目标。
我想创建一个tablular数据结构,旨在允许通过可能被散列的主列有效访问任何行条目。我认为最好的方法是维护一个双向链表的向量,每个列表代表一列,以及一个包含主列列表哈希到节点的映射的映射。现在,我犯的第一个错误是认为我需要创建自己的双链表实现,以便能够存储指向节点的指针,而实际上标准规定了std :: list的迭代器不会因插入或拼接而失效(参见larsmans的回答)。这里有一些伪代码来说明我之前想做的事情。假设存在一个类型名称T,表示条目类型以及dlist和节点类的存在,如前所述。
typedef dlist<T> column_type;
typedef vector<T> row_type;
typedef ptr_unordered_map<int32_t, row_type> hash_type;
shared_ptr<ptr_vector<column_type> > columns;
shared_ptr<hash_type> hashes;
现在,在阅读了larsmans的回答之后,我了解到自从Boost.MultiIndex满足我的所有需求后我就不需要了。即使我这样做,Boost.Intrusive也能提供更有效的数据结构来完成我所描述的内容。
感谢所有对此问题感兴趣或提供帮助的人!如果您还有其他问题,请添加其他评论,我会尽力澄清问题。
答案 0 :(得分:3)
的节点的引用
front()
应该返回对包含value_type
在STL / Boost术语中,听起来像是在考虑begin
而不是front
,除了begin
方法通常返回迭代器而不是引用。
我如何能够使用
std::list::iterator
类型的键哈希映射,并允许添加行而不会使映射中的条目过时
只是做; “list
具有重要的属性,即插入和拼接不会使列表元素的迭代器无效,甚至删除也只会使指向被删除元素的迭代器无效”(STL docs)。
如果您愿意,可以为整个表维护一个std::list
,并在其中维护vector
个迭代器来表示行的起点。
此外,你看过Boost.Intrusive和Boost.MultiIndex了吗? 您是否知道哈希的 std::map
(红黑树)是表示哈希表的非理想方式?