如何使用 std::list 作为公开节点的列表的接口的实现?

How to use std::list as the implementation of an interface for a list that exposes the nodes?

本文关键字:节点 列表 接口 实现 std 何使用 list      更新时间:2023-10-16

我有一个双链表的界面,它暴露了它的边缘。例如:

template <typename T>
class Listnode
{
public:
Listnode *prev;
Listnode *next;
T val;
};
template <typename T>
class List
{
public:
Listnode *head;
Listnode *tail;
// insert, remove, etc.
};

假设外部旧代码使用此接口。

我采用了std::list::sort的实现并在List中模仿了它。但是,如果可能的话,最好使用它而不是复制。

问题:是否可以以某种方式使用std::list来实现List::sort?特别是,使用std::list::sort修改ListListNodeprev-next指针,以便List最终排序。好吧,基本上不会在std::list内复制列表。

我的回答:在我看来,这是不可能的,因为据我在文档中看到的std::list,除了通过其迭代器遍历它们之外,不会暴露(另请参阅另一个问题(节点之间的边缘,而它的实现std::list::sort似乎直接修改了边缘,或者至少它与迭代器一起工作,直到调用方法(_M_transfer(, 就像在 GNU 实现中一样。

但我是初学者。我可能很容易错过一些东西。

你不能std::list符合你想要做的事情。您可以做的最接近的是让Listnode类型中的T成为std::list中元素的std::list<ActualT>::iterator。但是,如果此接口由对T有自己的期望的现有代码使用,则这不是一个真正的选择。