【问题标题】:STL sequential containers support insert (before) whereas forward_list support insert_afterSTL 顺序容器支持 insert (before) 而 forward_list 支持 insert_after
【发布时间】:2016-05-06 14:02:18
【问题描述】:

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

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

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

【问题讨论】:

  • 因为在一个给定的迭代器之前插入是不能以前向列表提供的空间效率在恒定时间内实现的。

标签: c++ c++11 stl


【解决方案1】:

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 提供的链接。

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 2010-09-14
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 2012-11-16
    • 2016-11-02
    相关资源
    最近更新 更多