JsTestDriver в NetBeans прекращает тестирование после неудачного утверждения

Чтобы понять, что я думаю, нужно понять философию алгоритмов C ++. Давайте сначала зададим этот вопрос:

Почему алгоритмы C ++ реализованы как свободные функции вместо функций-членов?

Ну, ответ довольно прост: избежать взрывов внедрения. Предположим, у вас есть M контейнеры и N алгоритмы, и если вы реализуете их как члены контейнеров, то будут M*N реализации. В этом подходе есть две (связанные) проблемы:

  • Во-первых, он не использует повторное использование кода.
  • C ++ решает эти проблемы, реализуя их как свободные функции , так что у вас есть только N реализации. Каждый из алгоритмов, работающих на контейнере , принимает пару итераторов, которые определяют диапазон . Если вы хотите перегрузки, которые принимают контейнер, а не пару итераторов, то Стандарт должен обеспечить такие перегрузки для каждого из алгоритмов, и будут 2*N реализации, которые в значительной степени победят ту самую цель, почему C ++ отделил алгоритмы от контейнеры в первую очередь, а половина из этих функций не делает ничего, что не может быть сделано другой половиной.

    Поэтому я не думаю, что это такая проблема. Чтобы избежать одного единственного аргумента, зачем использовать N больше функций (которые также налагают ограничение на его использование, например, вы не можете передать ему указатели )? Однако, если программисты хотят использовать такие функции в своей утилите, они могут реализовать их в любое время вместе со многими другими на основе стандартного алгоритма!


    Вы прокомментировали:

    Well , реализация 2 * N фактически является только N реализациями. Остальные N являются встроенными перегрузками, которые прямо называют «реальную» версию алгоритма, поэтому они являются только заголовками. Предоставление перегрузок контейнеров не отменяет цели разделения алгоритмов из контейнеров, поскольку (как вы можете видеть в моем примере) они могут использовать шаблоны для обработки всех типов контейнеров.

    Исходя из этого логики, вполне можно спорить по алгоритмам M*N. Так что они также выполняют функции-члены (и вызывают внутренние функции)? Я уверен, что многие ребята из ООП предпочли бы

    auto result = container.accumulate(val);
    

    над

    auto result = std::accumulate(container.begin(), container.end(), val);
    
170
задан Jeroen Heier 13 August 2019 в 15:03
поделиться