STL顺序容器支持insert(之前),而forward_list支持insert_after

时间:2016-01-28 23:42:09

标签: c++ c++11 stl

STL顺序容器,如vector,deque,list支持insert,在给定迭代器之前插入元素以支持

之类的语句

vector.insert(std :: end(container),container2.begin(),container2.end())

而forward_list支持insert_after。为什么STL维护者必须做出这种设计选择?

1 个答案:

答案 0 :(得分:4)

forward_list是作为单链表实现的。列表中的每个节点都有一个指向列表中下一个元素的指针。 (注意:指针是这里的通用术语。)

这意味着无法在列表中向后移动。你可以从列表的开头开始,然后继续前进,直到找到链接指向你拥有的项目的元素,但这样做很昂贵。以这种方式插入列表是O(N)操作(而不是O(1)

所有其他容器(vectorstringdequemapsetlist等都支持遍历前进并且在容器中向后,因此很容易找到“之前”的项目。 forward_list没有。

至于名称,如果在insert(list_iter, x)之前插入list_iter,但在位置后insert(forward_list_iterator, x)插入,则会更加混乱。所以设计师给了他们不同的名字。

[稍后]有人在forward_list的原始提案中对此进行了讨论,可以在http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2448.html找到。感谢Howard Hinnant的链接。