【问题标题】:Why wasn't std::forward_list given a count() member function?为什么没有给 std::forward_list 一个 count() 成员函数?
【发布时间】:2013-04-29 13:31:41
【问题描述】:

我理解为什么std::forward_listdoes not have a size() member function,因为O(1) 版本会弄乱某些splice() 重载的复杂性,并且因为O(N) 版本会与标准库的所有其余容器不一致.

同样,std::liststd::forward_list 已经有几个其他成员函数,它们的语义与标准库的 <algorithm> 角落中的表亲相同(merge()reverse()、@987654332 @、remove_if()unique()sort())。

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

【问题讨论】:

  • 基本上,STL 类已经足够大,在其中一个上添加这样的成员函数会触发用户在所有其他 STL 容器中想要它的东西。而且,正如您所说(并且在提案中已经提到),std::distance 可以立即为您获得尺寸,因此几乎没有伤害。
  • @rhalbersma 我认为许多用户仍然会问“为什么在 std::forward_list 中有一个 count 函数,而它在其他容器中不存在?”,即使他们已经有 @987654343 @.
  • @rhalbersma 根据经验,容器具有它们可以有效支持的成员函数,或者实现不同于通用实现的地方。 std::map 有一个find 成员函数,因为std::find 的语义不合适,而vector 有一个operator[],因为它可以实现为在恒定时间内运行。 std::count 函数不满足这两个:它不是“可以有效地完成此操作”的承诺,并且它的语义与非成员 std::distance 没有区别。那么为什么要添加呢?它有什么好处?
  • @rhalbersma 等待范围会以某种方式减少详细信息。
  • @Morwenn:不过,这将是一个漫长的等待 :(C++14 中没有范围

标签: c++ c++11 stl containers forward-list


【解决方案1】:

提供您提到的成员函数(merge()reverse()remove()remove_if()unique()sort())是因为它们比<algorithm> 标准中的通用算法具有更好的复杂性标题。

另一方面,像count() 这样的成员函数不会比std::distance(std::begin(some_list), std::end(some_list)) 更复杂。

此外,它可能会被误解为std::count 泛型算法的更复杂的版本,它的作用基本不同。

【讨论】:

  • 是的,这将是一个方便的功能,很像std::begin()/std::end() for std::array
  • @rhalbersma: std::begin()std::end() 不仅仅是一种便利;它们提供了一种通用的方法来获取任何可迭代容器的边界,包括数组。
  • std::count(begin(list), end(list), [](auto&&){ return true; });:D
  • @Xeo std::count_if 你的意思是
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 2015-04-18
    • 2011-12-10
    • 2014-08-22
    • 1970-01-01
    相关资源
    最近更新 更多