2013-04-29 3 views
4

Я понимаю, почему std::forward_listdoes not have a size() member function, так как версия O(1) испортит сложность некоторых перегрузок splice(), а так как версия O(N) будет несовместима со всеми остальными контейнерами стандартной библиотеки.Почему не был std :: forward_list задан функцией count()?

Это также верно, что оба std::list и std::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

+0

@Morwenn, но не было бы необходимости иметь 'count()' в любом другом контейнере, так как все они уже имеют 'size()'. – TemplateRex

+0

@rhalbersma: И нет необходимости иметь 'count()' в любом контейнере, так как у нас уже есть 'std :: distance()'. –

ответ

10

Функция-членов вы упоминаете (merge(), reverse(), remove(), remove_if(), unique(), sort()) обеспечены, потому что они имеют более сложны, чем общие алгоритмы в стандартных заголовках <algorithm>.

С другой стороны, функция-член, такая как count(), не будет иметь более сложную задачу, чем std::distance(std::begin(some_list), std::end(some_list)).

Кроме того, это может быть неверно истолковано как вариант с более сложной сложностью алгоритма std::count, который делает что-то принципиально иное.

+0

true, это будет удобная функция, очень похожая на' std :: begin() '/' std :: end() 'for' std :: array' – TemplateRex

+3

@rhalbersma: 'std :: begin()' и 'std :: end()' больше, чем просто удобство; они предоставляют общий способ для получения границ любого итерабельного контейнера, включая массивы. –

+2

+1 для 'std :: count'. – Morwenn

3

Причина в том, что, в отличие от перечисленных вами функций, использование стандартного библиотечного алгоритма для функции подсчета или размера будет столь же быстрой версией, которая имела прямой доступ к основной реализации.

Каждая из функций-членов, которые вы указали для std::forward_list, на самом деле быстрее, когда реализованы в качестве членов. В частности, они могут работать без каких-либо ненужных копий или перемещений содержащихся данных. Стандартные версии алгоритма библиотеки требуют, чтобы данные в контейнере были скопированы или перемещены.

Смежные вопросы