C++ 为什么没有';t std::forward_list给定count()成员函数?

C++ 为什么没有';t std::forward_list给定count()成员函数?,c++,c++11,stl,containers,forward-list,C++,C++11,Stl,Containers,Forward List,我理解为什么std::forward_list,因为O(1)版本会搞乱某些splice()重载的复杂性,而且O(N)版本会与标准库的所有其余容器不一致 同样正确的是,std::list和std::forward_list已经有了几个其他成员函数,它们的语义与标准库的角落中的同类函数相同(merge(),reverse(),remove(),remove_if(),unique()),排序()) 那么,为什么没有为具有返回std::distance(std::begin(some_list),st

我理解为什么
std::forward_list
,因为
O(1)
版本会搞乱某些
splice()
重载的复杂性,而且
O(N)
版本会与标准库的所有其余容器不一致

同样正确的是,
std::list
std::forward_list
已经有了几个其他成员函数,它们的语义与标准库的
角落中的同类函数相同(
merge()
reverse()
remove()
remove_if()
unique())
排序()


那么,为什么没有为具有返回
std::distance(std::begin(some_list),std::end(some_list))语义的
std::forward_list
提供一个
count()
复杂度为
O(N)
的成员函数

原因是,与您列出的函数不同,对计数或大小函数使用标准库算法与直接访问底层实现的版本一样快


您为
std::forward\u list
提到的每个成员函数在作为成员实现时实际上都更快。特别是,它们可以在不执行所包含数据的任何不必要的复制或移动的情况下进行操作。标准库算法版本要求复制或移动容器中的数据。

您提到的成员函数(
merge()
reverse()
remove()
remove\u if()
unique()
sort()
)是因为它们比
通用算法中的通用算法具有更好的复杂性,而通用算法的功能基本上是不同的。

基本上,STL类已经足够大了,在其中一个类上添加这样的成员函数将在用户中触发一些东西,这些东西将在所有其他STL容器中使用。而且,正如您所说(并且在提案中已经提到),
std::distance
可以在很短的时间内为您获得大小,因此没有什么危害。@rhalbersma我认为许多用户仍然会问,“为什么在
std::forward\u list
中有
count
函数,而在其他容器中却没有?”,尽管容器已经有了
size
@rhalbersma作为经验法则,但是容器具有它们可以有效支持的成员函数,或者在实现不同于一般实现的地方
std::map
有一个
find
成员函数,因为
std::find
的语义不合适,而
vector
有一个
操作符[]
,因为它可以在固定时间内运行。
std::count
函数不满足这两个条件:它不能保证“可以有效地完成此操作”,而且它的语义与非成员的
std::distance
没有区别。那么,为什么要添加它呢?它有什么功能?@rhalbersma Wait for ranges一个详细的范围将以某种方式减少。@Morwenn:这将是一个很长的等待:(C++14中没有范围是真的,这将是一个方便的函数,很像
std::begin()
/
std::end()
对于
std::array
@rhalbersma:
std::begin()
std::end())
不仅仅是一种方便;它们提供了一种通用的方法来获取任何iterable容器(包括数组)的边界。
std::count(begin(list)、end(list),[](auto&&){return true;});
:D@Xeo
std::count\u如果
,你的意思是