2013-04-29 68 views
4

我明白爲什麼std::forward_listdoes not have a size() member function,因爲O(1)版本會弄亂某些splice()過載的複雜性,並且因爲O(N)版本會與標準庫的其餘所有容器不一致。爲什麼不是std :: forward_list給定一個count()成員函數?

,這也是事實,無論std::liststd::forward_list已經擁有相同的語義從<algorithm>角落標準庫(merge()reverse()remove()remove_if()unique()sort())的他們的堂兄弟其他幾個成員函數。

那麼爲什麼count()成員函數的O(N)複雜度提供給std::forward_list,它的返回語義是std::distance(std::begin(some_list), std::end(some_list))

+0

基本上,STL類已經足夠大了,並且在其中一個上添加這樣的成員函數會觸發用戶需要的所有其他STL容器中的東西。而且,正如你所說(在提案中已經提到過),'std :: distance'可以在沒有更多時間的情況下獲得大小,所以幾乎沒有什麼傷害。 – Morwenn 2013-04-29 13:35:30

+0

@Morwenn,但不需要在任何其他容器中都有count(),因爲它們都已經有size()。 – TemplateRex 2013-04-29 13:36:50

+0

@rhalbersma:因爲我們已經有'std :: distance()',所以不需要在任何容器中都有count()。 – 2013-04-29 13:38:06

回答

10

你提到的成員函數(merge()reverse()remove()remove_if()unique()sort())提供,因爲他們有更好的比<algorithm>標準頭通用算法的複雜性。

另一方面,成員函數count()的複雜度不會比std::distance(std::begin(some_list), std::end(some_list))更好。

此外,它可能會被誤解爲std::count泛型算法的更好複雜版本,它會做一些基本上不同的操作。

+0

屬實,這將是一個方便的功能,就像'的std ::開始()'/'的std ::結束()''爲std :: array' – TemplateRex 2013-04-29 13:37:59

+3

@rhalbersma:'std :: begin()'和'std :: end()'不僅僅是一種方便;他們提供了一個通用的方式來獲得可迭代的容器,包括數組的邊界。 – 2013-04-29 13:39:32

+2

對於'std :: count' +1。 – Morwenn 2013-04-29 13:42:30

3

原因是因爲,與您列出的函數不同,使用標準庫算法進行計數或大小函數的速度與直接訪問底層實現的版本一樣快。

您爲std::forward_list提到的每個成員函數實際上都是更快的成員。尤其是,它們可以在不執行任何不必要的複製或移動所包含數據的情況下運行。標準庫算法版本要求複製或移動容器中的數據。

相關問題