Охватывают ли концепции STL все требования к аргументам для алгоритмов STL?

Если посмотреть на имена шаблонов некоторых алгоритмов,
Я вижу, что название соответствует концепции библиотеки.

принимать станд :: рассогласование например.

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

Требуется BinaryPredicate который также является концепция библиотеки.


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

  • UnaryPredicate
  • UnaryFunction
  • UnaryOperation
  • BinaryOperation
  • так далее

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

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

1

Решение

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

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)) (для версии с аргументом предиката). недействительными
только итераторы и ссылки на стертые элементы.

БроскиНичего, если только исключение не выдается сравнением равенства или предикатом.

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

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

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

1

Другие решения

Других решений пока нет …