数据结构的设计模式

时间:2011-07-12 03:36:57

标签: c++ design-patterns iterator

这个问题已得到解答,因此下面的内容解释了我想要实现的目标。

我想创建一个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也能提供更有效的数据结构来完成我所描述的内容。

感谢所有对此问题感兴趣或提供帮助的人!如果您还有其他问题,请添加其他评论,我会尽力澄清问题。

1 个答案:

答案 0 :(得分:3)

  

front()应该返回对包含value_type

的节点的引用

在STL / Boost术语中,听起来像是在考虑begin而不是front,除了begin方法通常返回迭代器而不是引用。

  

我如何能够使用std::list::iterator类型的键哈希映射,并允许添加行而不会使映射中的条目过时

只是做; “list具有重要的属性,即插入和拼接不会使列表元素的迭代器无效,甚至删除也只会使指向被删除元素的迭代器无效”(STL docs)。

如果您愿意,可以为整个表维护一个std::list,并在其中维护vector个迭代器来表示行的起点。

此外,你看过Boost.IntrusiveBoost.MultiIndex了吗? 您是否知道哈希的std::map(红黑树)是表示哈希表的非理想方式?