Охватывают ли концепции 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
,