为什么标准委员会选择为std::forward_list
实施API以使其不符合Sequence
容器概念要求,是否有某种原因?
Sequence
概念要求指定容器必须与以下表达式兼容:
c.insert(it, v); // insert at position
c.insert(it, n, v); // fill insert
c.insert(it, begin, end); // insert range
...其中it
是一个迭代器,v
是一个元素,n
是一个整数,begin/end
是一个迭代器范围。
由于insert
函数需要迭代器起始位置,因此单独链接列表无法使用此API。但由于某种原因,std::forward_list
具有insert_after
函数,这会破坏与Sequence概念的兼容性。
这有什么理由吗?
答案 0 :(得分:2)
原因是在单个链接列表中的元素之前插入非常低效:您必须从头开始并迭代直到找到要插入的请求位置,插入O(n)
而不是恒定时间。
比较他们为什么不在operator[]
中提供std::list
,因为这需要线性时间。正如list
与vector
相比,forward_list
无法满足随机访问的要求,list
与{{1}}相比无法满足序列的所有要求。