1

我有一个CNode继承 boost 的类,list_base_hook以便我可以在 boost 侵入列表中使用它。

class CNode
   //Base hook with default tag, raw pointers and safe_link mode
   :public list_base_hook<>
{
   // Suppose the linked pointers inherited from list_base_hook
   // are "m_prev", "m_next".
};

当节点从列表中弹出时,它将被推入另一个 FIFO。该 FIFO 计划重用m_prev,m_next将节点链接在一起,同时实现单读取器-单写入器线程安全语义。

在我的 FIFO 中:

class CFIFO
{
public:
  void push_back(CNode *node)
  {
     // Is there any way to update the "m_next"/"m_prev" fields?
     // SetNextLink is faked here..
     m_tail->SetNextLink(node);
     ..
  }
};

有没有办法得到m_prev,的m_next领域CNode

4

2 回答 2

1

您可以使用iterator_to从 const 引用转到迭代器。然后,您可以递减或递增迭代器。您实际上可以使用s_iterator_to双向链接的侵入式列表。

更新:哦,你不想“得到”它们,你想改变它们。在这种情况下,您必须像实现其他侵入式容器一样实现自己的侵入式容器。就个人而言,我只是在内部使用侵入性列表。使双向链表像 FIFO 一样工作基本上是微不足道的。

于 2013-01-08T12:23:35.910 回答
1

链接字段prev_next_继承自list_base_hook,我可以直接访问它们,因为它们在基础中是公共的。

class MyNode: public list_base_hook<>
{
   //..
};

list<MyNode> myList;
for (list<MyNode>::iterator it = myList.begin(); it != myList.end(); ++it)
{
   // The type of the pointer is list<MyNode>::node_ptr
   cout << it->prev_ << it->next_ << endl;
}
于 2013-01-09T04:38:04.460 回答