2016-10-23 2 views
1

При взгляде на имена шаблонов некоторых из алгоритмов,
Я вижу, что это имя соответствует концепции библиотеки.Включает ли концепции STL все требования к аргументам для алгоритмов STL?

Возьмите, например, std::mismatch.

template< class InputIt1, class InputIt2, class BinaryPredicate > 
std::pair<InputIt1,InputIt2> 
mismatch(InputIt1 first1, InputIt1 last1, 
      InputIt2 first2, 
      BinaryPredicate p); 

Он принимает BinaryPredicate, который также является library concept.


Глядя на другие алгоритмы, хотя, я вижу:

  • UnaryPredicate
  • UnaryFunction
  • UnaryOperation
  • BinaryOperation
  • и т.д.

, и у них нет соответствующей концепции.

Есть ли причина, по которой они были исключены?
Являются ли эти понятия производными путем объединения существующих концепций?

+0

cppreference документировал некоторые из них, а не другие. Я думаю, вы переусердствовали. –

+0

'UnaryPredicate' кажется синонимом' Predicate', по крайней мере. – StoryTeller

+1

'BinaryPredicate' - это имя типа/типа, которое используется и определено в реальном стандарте C++ (см. Параграф 9.1 параграфа [этот проект] (http://www.open-std.org/jtc1/sc22/wg21/ документы/документы/2013/n3690.pdf)). Тем не менее, термины 'UnaryPredicate' и' UnaryFunction' никогда не встречаются в стандарте. 'BinaryOperation' и' UnaryOperation' используются в стандарте, но не определены так явно, как 'BinaryPredicate'. – Cornstalks

ответ

1

Стандарт C++ не определяет понятия. Он определяет «требования», такие как:

EqualityComparable, LessThanComparable, DefaultConstructible, 
MoveConstructible, CopyConstructible, MoveAssignable, CopyAssignable, 
Destructible, NullablePointer, Hash, TrivialClock, Allocator, 
Swappable or Container 

Но в некоторых требованиях используется другой синтаксис, чем другие. Например, allocator и swappable использовать в нижнем регистре (курсив распределителем), а другие из моего списка образца шрифт моноширинный CamelCase, или, как описано в стандарте, с постоянным типа (EqualityComparable).

Другие «понятия», как PODType, рассматриваются в стандарте как просто определения.

Например, BinaryPredicate не определен как понятие или определение; так же, как имя шаблона из функций, используя его:

void unique(); 
template <class BinaryPredicate> void unique(BinaryPredicate pred); 

эффекты: стирает все, но первый элемент из каждой последовательной группы равных элементов упомянутой посредством итератора i в диапазоне [first + 1,last), для которого *i == *(i-1) (для версии без аргументов ) или pred(*i, *(i - 1)) (для версии с аргументом предиката). Invalidates только итераторы и ссылки на стираемые элементы.

Throws: Ничего, если исключение не будет выбрано путем сравнения равенства или предиката.

Сложность: Если диапазон [first,last) не пусто, точно (last - first) - 1 приложения соответствующий предикат, в противном случае применения предиката.

Как вы видите, BinaryPredicate не определен. Он просто показывает, как это влияет на поведение std::unique.

С другой стороны, список концепций cppreference извлекается из концепции , что является нестандартным. Кроме того, cppreference не совершенен, и не каждая страница wiki полностью или полностью описана с точки зрения концептуального предложения, и есть другие параметры шаблона, которые даже не отображаются в стандарте, например UnaryOperator.

+0

Список Cppreference на этой странице имеет «именованные требования, используемые в нормативном тексте стандарта C++», а не те из предложений концепции (фактически диапазонов). – Cubbi

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