【问题标题】:Why is the C++ STL set container's count() method thus named?为什么 C++ STL 设置容器的 count() 方法如此命名?
【发布时间】:2013-05-14 04:06:58
【问题描述】:

它真正检查的是 contains() 而不是出现次数的计数,对吧?也不允许重复,所以 contains() 不是比 count() 更好的名称吗?

【问题讨论】:

  • 是的,这有点令人困惑,因为 set::count() 实际上完成了contains 的工作。可能是出于历史原因。
  • 我认为这是为了匹配multiset 接口,其中可能有重复项(因此count() 可以返回>1)。虽然不是积极的。
  • Blah blah 一致性这是一个愚蠢的名字!

标签: c++ stl naming-conventions naming


【解决方案1】:

这是为了使其与其他容器类保持一致,因为多态性的一大优点是能够使用相同的 API 处理不同的类。

确实实际上返回了计数。一个集合的计数只能是零或一这一事实并不会改变这方面。

从根本上与一个只允许每个“值”同时具有两个东西的集合对象没有什么不同。在这种情况下,它将返回零、一或二的计数,但它仍然是计数,与集合相同。

需要此标准的相关部分是C++11 23.2.4,它讨论了关联容器setmultisetmapmultimap。表 102 包含对这些关联容器的要求,超出了“常规”容器的要求,count 的位解释如下:

size_type a.count(k) - 返回键等于k 的元素数。复杂度是log(a.size()) + a.count(k)

【讨论】:

  • Complexity is log(a.size()) + a.count(k) 是什么意思?它似乎是递归的:)
  • @Cade,我有点担心我抄错了,但没有。它实际上不是递归的,因为在调用a.count(k) 来计算复杂度的函数中没有任何内容 - 它只是说明函数的复杂度受与键匹配的元素数量的影响。跨度>
【解决方案2】:

所有关联容器必须满足§23.2.4/8 表 102 - 关联容器要求中列出的要求。其中之一是他们实现a.count(k) 然后

返回key等于k的元素个数

所以原因是在所有关联容器之间有一个一致的接口。例如,在编写必须与任何关联容器一起使用的通用函数模板时,这种一致性将非常重要。

【讨论】:

    【解决方案3】:

    这是对容器的标准操作,返回匹配元素的数量。在列表之类的东西中,这非常有意义。碰巧在一个集合中,一个元素只能出现一次,因此count 永远不会返回大于 1 的值。

    【讨论】:

    • “在列表之类的东西中,这很有意义。”但是 std::list 没有计数方法。
    • 你是对的。我真的只是在尝试命名另一种容器类型,而不是专门在 STL 中。相反,只是 any 可以想象具有count 方法的类型。 @paxdiablo 提到了很多 确实 具有计数方法的特定容器。
    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 2010-10-17
    • 2012-08-10
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    相关资源
    最近更新 更多