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

C++ 如何使用std::list作为公开节点的列表接口的实现?,c++,c++17,stdlist,C++,C++17,Stdlist,我有一个双重链接列表的界面,它暴露了它的边缘。例如: 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

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

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.
};
模板
类Listnode
{
公众:
Listnode*prev;
Listnode*下一步;
T值;
};
模板
班级名单
{
公众:
Listnode*头;
Listnode*尾部;
//插入、移除等。
};
假设外部旧代码使用此接口

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

问题:是否可以以某种方式使用
std::list
来实现
list::sort
?特别是,使用
std::list::sort
修改
list
ListNode
prev
-
next
指针,以使
列表
得到排序。好的,不需要在
std::list
中复制列表

我的答案:在我看来这是不可能的,因为据我所知,
std::list
除了通过其迭代器遍历节点外,不会暴露(也可参见)节点之间的边,而其
std::list::sort
的实现似乎直接修改了边,或者至少在调用一个方法(
\u M_transfer
)之前,它可以与迭代器一起工作,如中所示


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

你不能让
std::list
符合你想要做的。您所能做的最接近的事情就是让
Listnode
类型中的
T
成为
std::list::iterator
std::list
中的元素。但是,如果现有代码正在使用这个接口,而这些代码对
T
有自己的期望,那么这实际上不是一个选项。

对列表进行排序是个坏主意。对向量进行排序,或者如果必须有一个列表,则对指向列表元素的指针向量进行排序要好得多。与使用带迭代器的
std::list
相比,您的代码有什么优势
ListNode
在功能上与迭代器非常相似(允许移动到上一个/下一个节点并获取值)。不要重新发明轮子。@hill在代码块后面读这句话。那么,对公共成员来说,它必须完全一样吗?如果您可以对接口做一些小的更改,最终可能会简单得多。