2013-05-14 83 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的等效鍵元件的數量

所以原因是讓所有關聯容器之間的一致的界面。例如,編寫必須與任何關聯容器一起工作的通用函數模板時,這種一致性將非常重要。

相關問題