Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 数据结构设计模式_C++_Design Patterns_Iterator - Fatal编程技术网

C++ 数据结构设计模式

C++ 数据结构设计模式,c++,design-patterns,iterator,C++,Design Patterns,Iterator,这个问题已经得到了回答,下面是我想要达到的目标的解释 我想创建一个tablular数据结构,允许通过可能被散列的主列高效访问任何行条目。我认为最好的方法是维护一个双链表向量,每个双链表代表一列,以及一个包含主列条目散列到节点的映射的映射。现在,我犯的第一个错误是,我需要创建自己的双链表实现,以便能够存储指向节点的指针,而事实上,标准规定std::list的迭代器不会因插入或拼接而失效(请参见larsmans的回答)。这里有一些伪代码来说明我之前想要做的事情。如前所述,假设存在表示条目类型的typ

这个问题已经得到了回答,下面是我想要达到的目标的解释

我想创建一个tablular数据结构,允许通过可能被散列的主列高效访问任何行条目。我认为最好的方法是维护一个双链表向量,每个双链表代表一列,以及一个包含主列条目散列到节点的映射的映射。现在,我犯的第一个错误是,我需要创建自己的双链表实现,以便能够存储指向节点的指针,而事实上,标准规定std::list的迭代器不会因插入或拼接而失效(请参见larsmans的回答)。这里有一些伪代码来说明我之前想要做的事情。如前所述,假设存在表示条目类型的typename T,并且存在dlist和node类

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;
typedef数据列表列\u类型;
typedef向量行\ u类型;
typedef ptr_无序_映射散列_类型;
共享_ptr列;
共享的ptr散列;
现在,在阅读了larsmans的答案后,我了解到我不需要这些,因为Boost.MultiIndex满足了我的所有需求。即使我这样做了,Boost.Intrusive也提供了更高效的数据结构来完成我所描述的任务

感谢所有对这个问题感兴趣或提供帮助的人!如果您还有任何问题,请添加另一条评论,我将尽力进一步澄清问题

front()
应返回对包含
值\u类型的节点的引用

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

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

只要做;“
list
s具有一个重要属性,即插入和拼接不会使列表元素的迭代器失效,即使删除也只会使指向已删除元素的迭代器失效”()

如果需要,可以为整个表维护一个
std::list
,并在其中维护一个迭代器向量,以表示行的起点


此外,你有没有看过和?您知道散列的
std::map
(红黑树)是表示散列表的一种非常不理想的方式吗?

运算符[]
应该仅在底层是连续内存序列时才允许启用。在类似链表的数据结构上使用它不是一个好主意。@Mahesh-这就是为什么在
std::list
上,
操作符[]
没有重载,而在
std::vector
上却没有重载的原因。@Mahesh-从什么时候开始
std::map
是连续的<仅当数据结构支持存储数据的标识符时,才允许使用代码>运算符[]
,而
向量和
映射都支持,但
列表却不支持。这与
标准::列表有何区别?迭代器在功能上等同于双链表中的节点指针。-为您提供上一个节点,++为您提供下一个节点,*为您提供值<代码>标准::列表
只有当列表被销毁或从列表中删除特定项时,迭代器才会失效。“你这么做到底想得到什么?”J.N.在我这么多年的经验中,这件事还没有发生在我身上。如果您必须按位置访问链接列表,我为您感到抱歉,这表明数据结构设计非常糟糕。@void pointer:即使在编辑之后,@Nicol Bolas的问题仍然有效。为什么不能使用std::list、迭代器、begin()、end()等等?这在功能上等同于你想要的。啊,谢谢你的报价;我不知道迭代器的位置是以这种方式为std::list保留的。是的,我知道使用std::map是次优的,但是伪代码应该是用于描述的原始草图;如果我使用(糟糕的)设计,我会使用boost::无序_映射。我一定会看看Boost.Intrusive和Boost.MultiIndex;谢谢Boost::Intrusive和Boost::MultiIndex似乎非常有用;我正在阅读这两个版本的文档,并将在将来使用它们。再次感谢你的帮助!