为什么没有std::forward_list::insert_after
将 第一个 插入的元素作为其他序列容器返回,例如list
和vector
。有任何故意的原因吗?
答案 0 :(得分:3)
forward_list
与其他序列非常不同,insert_after
也是如此。为了返回第一个插入的项目,它必须使用额外的时间和空间来保存该元素,而 last 元素将作为插入算法的一部分提供。不仅如此,而且将迭代器返回到从范围插入的第一个元素将为您提供一个迭代器,您可以使用该迭代器插入刚刚添加的范围的中间,而到范围末尾的迭代器允许您追加其他数据
答案 1 :(得分:1)
我不知道委员会的推理,但这是我的:
您可以插入多个元素,例如一个“范围”。见http://en.cppreference.com/w/cpp/container/forward_list/insert_after
返回第一个元素并不是很有价值,因为到第一个元素是微不足道的 - 你已经有一个迭代器,之后就插入了它。
OTOH,如果插入了大量节点,到最后插入的元素可能会很昂贵。
答案 2 :(得分:1)
经过一段时间的考虑,这是我的理解。
对于正常序列容器,insert
获取迭代器(我将调用itl
)作为参数,并在itl
之前插入元素。然后返回指向第一个插入元素的迭代器(itf
)。现在你有2个迭代器分别表示插入元素的范围(第一个和不可见的)。
elem-elem-inserted-inserted-inserted-elem-elem
| |
(itf) (itl)
但是,insert
操作可能会使itl
无效,因此我们需要考虑以下两种情况:
对于链接结构,itl
仍然有效。因此(itf
,itl
)形成插入元素的有效范围。
对于连续结构,itl
在插入后无效。然而,这样的结构通常支持随机访问,因此通过itl
上的简单算术获得itf
仍然相对容易。另一方面,将迭代器返回到第一个插入的元素会保持一致性。
insert_after
的{{1}}获取迭代器(forward-list
)作为参数,并在其后插入元素。然后它返回一个迭代器到最后插入的元素(itf
)。由于itl
仍然有效,我们再次有类似的范围。
itf
无论elem-elem-inserted-inserted-inserted-elem-elem
| |
(itf) (itl)
操作是否将迭代器返回到第一个插入元素或最后插入的元素,它总是尝试同时提供对插入元素的开头和结尾的访问,这提供了最大的灵活性