Чтобы понять, что я думаю, нужно понять философию алгоритмов C ++. Давайте сначала зададим этот вопрос:
Почему алгоритмы C ++ реализованы как свободные функции вместо функций-членов?
Ну, ответ довольно прост: избежать взрывов внедрения. Предположим, у вас есть M
контейнеры и N
алгоритмы, и если вы реализуете их как члены контейнеров, то будут M*N
реализации. В этом подходе есть две (связанные) проблемы:
C ++ решает эти проблемы, реализуя их как свободные функции , так что у вас есть только N
реализации. Каждый из алгоритмов, работающих на контейнере , принимает пару итераторов, которые определяют диапазон . Если вы хотите перегрузки, которые принимают контейнер, а не пару итераторов, то Стандарт должен обеспечить такие перегрузки для каждого из алгоритмов, и будут 2*N
реализации, которые в значительной степени победят ту самую цель, почему C ++ отделил алгоритмы от контейнеры в первую очередь, а половина из этих функций не делает ничего, что не может быть сделано другой половиной.
Поэтому я не думаю, что это такая проблема. Чтобы избежать одного единственного аргумента, зачем использовать N
больше функций (которые также налагают ограничение на его использование, например, вы не можете передать ему указатели )? Однако, если программисты хотят использовать такие функции в своей утилите, они могут реализовать их в любое время вместе со многими другими на основе стандартного алгоритма!
Вы прокомментировали:
Well , реализация 2 * N фактически является только N реализациями. Остальные N являются встроенными перегрузками, которые прямо называют «реальную» версию алгоритма, поэтому они являются только заголовками. Предоставление перегрузок контейнеров не отменяет цели разделения алгоритмов из контейнеров, поскольку (как вы можете видеть в моем примере) они могут использовать шаблоны для обработки всех типов контейнеров.
blockquote>Исходя из этого логики, вполне можно спорить по алгоритмам
M*N
. Так что они также выполняют функции-члены (и вызывают внутренние функции)? Я уверен, что многие ребята из ООП предпочли быauto result = container.accumulate(val);
над
auto result = std::accumulate(container.begin(), container.end(), val);