SGI slist和C++;11转发列表?

SGI slist和C++;11转发列表?,list,c++11,containers,singly-linked-list,List,C++11,Containers,Singly Linked List,SGIslist和C++11std::forward_list都与我相同,除非我遗漏了什么;两者都实现了一个单链表 我认为,由于C++标准委员会没有采用名称SLIST,而是选择了一个新的名字,即转发列表,当它们将容器添加到C++的标准库中时, < P >一个主要区别是: STD::转发子列表< /C>缺少一个代码> siz()/成员函数,其中,sgi::slist没有。这样做的动机是O(N)size()有问题。提供了有关转发列表的设计决策的更多详细信息 更新: 我最近有了一个很好的理由来仔细研究

SGI
slist
和C++11
std::forward_list
都与我相同,除非我遗漏了什么;两者都实现了一个单链表


我认为,由于C++标准委员会没有采用名称SLIST,而是选择了一个新的名字,即转发列表,当它们将容器添加到C++的标准库中时,

< P >一个主要区别是:<代码> STD::转发子列表< /C>缺少一个代码> siz()/<代码>成员函数,其中,
sgi::slist
没有。这样做的动机是O(N)
size()
有问题。提供了有关
转发列表
的设计决策的更多详细信息

更新:

我最近有了一个很好的理由来仔细研究这个问题
slist
还有其他成员函数,人们可能会认为它们是O(1),但实际上是O(N)。这些措施包括:

iterator previous(iterator pos);
const_iterator previous(const_iterator pos) const;
iterator insert(iterator pos, const value_type& x);
iterator erase(iterator pos);
void splice(iterator position, slist& x);
void splice(iterator position, slist& x, iterator i);

简言之,如果您不十分小心,那么使用
slist
可能会导致严重的性能问题。相反,使用
std::forward_list
可以确保从单链接列表中获得预期的O(1)性能。

简单地说,sgi::slist和forward_list非常相似

区别在于forward_list缺少sgi::slist中包含的size()成员函数,forward_list包含sgi::slist中不包含的emplace_after成员函数。此外,forward_list不像sgi::slist那样提供插入和擦除成员函数


如果您知道任何其他差异,请毫不犹豫地提及它们。

我最近遇到了另一个差异。之后的方法
具有不同的接口和行为

1) forward_list要求您传递要从中移动的容器作为第二个参数:

void splice_after( const_iterator pos, forward_list& other,
                   const_iterator first, const_iterator last );
滑动列表:

void splice_after(iterator pos, iterator before_first, iterator before_last)
这与重载类似


2) 针对上述重载:最后一个迭代器的解释不同!当slist移动范围时[before_first+1,before_last+1>,forward_list移动范围。因此,在转换代码时(例如,由于在GCC中不推荐使用slist),请确保使用:last=before_last+1。

感谢您的回复。读这篇文章很有趣。我同意不包含大小()的决定成员函数。如果我必须知道std::list的大小,我想我可以使用它。主要区别在于forward\u list对象是单链表,因此它们只能向前迭代,以换取更小和更高效。std::list是双链表