我理解为什么std::forward_list
does not have a size()
member function,因为O(1)
版本会破坏某些splice()
重载的复杂性,因为O(N)
版本会是与标准库的所有其他容器不一致。
同样正确的是std::list
和std::forward_list
已经有几个其他成员函数具有与标准库<algorithm>
角上的同类相同的语义({{1} },merge()
,reverse()
,remove()
,remove_if()
,unique()
)。
那么为什么sort()
复杂的count()
成员函数没有提供给具有返回O(N)
语义的std::forward_list
?
答案 0 :(得分:11)
您提及的会员功能(merge()
,reverse()
,remove()
,remove_if()
,unique()
,sort()
)是因为他们有比<algorithm>
标准头文件中的通用算法更复杂。
另一方面,count()
等成员函数的复杂性不会高于std::distance(std::begin(some_list), std::end(some_list))
。
此外,它可能被误解为std::count
通用算法的更复杂版本,它做了一些基本不同的事情。
答案 1 :(得分:3)
原因在于,与您列出的函数不同,对计数或大小函数使用标准库算法的速度与直接访问底层实现的版本一样快。
当您作为成员实施时,您为std::forward_list
提到的每个成员函数实际上都更快。特别是,它们可以在不执行任何不必要的复制或移动所包含的数据的情况下操作。标准库算法版本要求复制或移动容器中的数据。