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在代码块后面读这句话。那么,对公共成员来说,它必须完全一样吗?如果您可以对接口做一些小的更改,最终可能会简单得多。