2013-05-14 33 views
8

它真正检查的是contains()而不是发生次数,对吧?不允许重复,所以不会包含()是比count()更好的名称吗?为什么命名C++ STL集合的容器的count()方法?

+0

是的,它有点令人困惑,因为set :: count()实际上做了'contains'的工作。可能出于历史原因。 – taocp 2013-05-14 04:09:27

+1

我认为这是匹配['multiset'](http://en.cppreference.com/w/cpp/container/multiset)接口,其中可能有重复(因此'count()'可以返回> 1 )。虽然不是积极的。 – Xymostech 2013-05-14 04:13:00

+0

Blah blah一致性这是一个愚蠢的名字! – Nils 2014-01-08 13:05:48

回答

12

这是为了使其与其他容器类一致,因为多态性的一个重要方面是能够使用相同的API处理不同的类。

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

它不是从根本上说不同于一个集合对象,它只允许每个“值”在同一时间的两件事情。在这种情况下,它会返回零个,一个或两个计数,但它仍然是一个计数,与一个集合相同。

标准的相关部分需要,这是C++11 23.2.4其中谈到了关联容器setmultisetmapmultimap。表102包含这些关联容器之上为“常规”的容器的要求的要求,以及用于count位如下转述:

size_type a.count(k) - 返回与键相当于k元件的数量。复杂性是log(a.size()) + a.count(k)

+0

“复杂性是log(a.size())+ a.count(k)”是什么意思?它似乎递归:) – Cade 2017-07-31 16:30:29

+0

@Cade,我有点担心,我错误地转录了它,但没有。它不是*实际*递归,因为调用'a.count(k)'的函数没有任何内容来计算复杂性 - 它只是声明函数的复杂性受到与键匹配的元素数量的影响。 – paxdiablo 2017-08-03 01:30:42

+0

嘿,哇,那么精确。感谢您回答后续问题。 – Cade 2017-08-03 02:09:49

-1

这是容器的标准操作,返回匹配元素的数量。在像列表这样的事情上,这是非常有意义的。恰巧恰巧在一组中,只能出现一次元素,因此count永远不会返回大于1的值。

+3

“在像列表这样的事情中,这非常合理。”但是std :: list没有计数方法。 – StackedCrooked 2013-05-14 04:50:24

+0

你是对的。我真的只是在尝试命名另一种容器类型,而不是专门在STL中进行操作;相反,只是*任何可以设想有'count'方法的类型。 @paxdiablo提到了很多特定的容器,它们都有一个计数方法。 – Gian 2013-05-14 05:01:38

4

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

返回到K的等效键元件的数量

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

相关问题