Если посмотреть на имена шаблонов некоторых алгоритмов,
Я вижу, что название соответствует концепции библиотеки.
принимать станд :: рассогласование например.
template< class InputIt1, class InputIt2, class BinaryPredicate >
std::pair<InputIt1,InputIt2>
mismatch( InputIt1 first1, InputIt1 last1,
InputIt2 first2,
BinaryPredicate p);
Требуется BinaryPredicate
который также является концепция библиотеки.
Глядя на другие алгоритмы, я вижу:
и у них нет соответствующей концепции.
Есть ли причина, по которой они были исключены?
Являются ли эти концепции выводимыми путем объединения существующих концепций?
Стандарт 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
,
Других решений пока нет …