Охватывают ли концепции 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 которая также является концепцией библиотеки.


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

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

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

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

1 ответ

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

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

Но некоторые требования используют другой синтаксис, чем другие. Например, allocator а также swappable используйте строчный курсив (allocator), а остальные из моего примера списка - шрифт camelcase monospace или, как описано в стандарте, константу с типом (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,

Другие вопросы по тегам