STL顺序容器,如vector,deque,list支持insert,在给定迭代器之前插入元素以支持
之类的语句vector.insert(std :: end(container),container2.begin(),container2.end())
而forward_list支持insert_after。为什么STL维护者必须做出这种设计选择?
答案 0 :(得分:4)
forward_list
是作为单链表实现的。列表中的每个节点都有一个指向列表中下一个元素的指针。 (注意:指针是这里的通用术语。)
这意味着无法在列表中向后移动。你可以从列表的开头开始,然后继续前进,直到找到链接指向你拥有的项目的元素,但这样做很昂贵。以这种方式插入列表是O(N)
操作(而不是O(1)
)
所有其他容器(vector
,string
,deque
,map
,set
,list
等都支持遍历前进并且在容器中向后,因此很容易找到“之前”的项目。 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的链接。