为什么不#std :: forward_list :: insert_after`返回作为其他序列容器插入的第一个元素?

时间:2015-12-01 15:21:50

标签: c++

为什么没有std::forward_list::insert_after 第一个 插入的元素作为其他序列容器返回,例如listvector 。有任何故意的原因吗?

3 个答案:

答案 0 :(得分:3)

forward_list与其他序列非常不同,insert_after也是如此。为了返回第一个插入的项目,它必须使用额外的时间和空间来保存该元素,而 last 元素将作为插入算法的一部分提供。不仅如此,而且将迭代器返回到从范围插入的第一个元素将为您提供一个迭代器,您可以使用该迭代器插入刚刚添加的范围的中间,而到范围末尾的迭代器允许您追加其他数据

答案 1 :(得分:1)

我不知道委员会的推理,但这是我的:

您可以插入多个元素,例如一个“范围”。见http://en.cppreference.com/w/cpp/container/forward_list/insert_after

返回第一个元素并不是很有价值,因为到第一个元素是微不足道的 - 你已经有一个迭代器,之后就插入了它。

OTOH,如果插入了大量节点,到最后插入的元素可能会很昂贵。

答案 2 :(得分:1)

经过一段时间的考虑,这是我的理解。

1。正常序列容器

对于正常序列容器,insert获取迭代器(我将调用itl)作为参数,并在itl之前插入元素。然后返回指向第一个插入元素的迭代器(itf)。现在你有2个迭代器分别表示插入元素的范围(第一个和不可见的)。

elem-elem-inserted-inserted-inserted-elem-elem
             |                        |
           (itf)                    (itl)

但是,insert操作可能会使itl无效,因此我们需要考虑以下两种情况:

1.1链接结构

对于链接结构,itl仍然有效。因此(itfitl)形成插入元素的有效范围。

1.2连续结构

对于连续结构,itl在插入后无效。然而,这样的结构通常支持随机访问,因此通过itl上的简单算术获得itf仍然相对容易。另一方面,将迭代器返回到第一个插入的元素会保持一致性。

2。正向列表

insert_after的{​​{1}}获取迭代器(forward-list)作为参数,并在其后插入元素。然后它返回一个迭代器到最后插入的元素(itf)。由于itl仍然有效,我们再次有类似的范围。

itf

3。结论

无论elem-elem-inserted-inserted-inserted-elem-elem | | (itf) (itl) 操作是否将迭代器返回到第一个插入元素或最后插入的元素,它总是尝试同时提供对插入元素的开头和结尾的访问,这提供了最大的灵活性