Skip to content

Comparators and projections

Morwenn edited this page Jun 12, 2020 · 8 revisions

Most sorting algorithms in cpp-sort accept comparison and/or projection parameters. The library therefore considers these kinds of functions to be first-class citizens too and provides dedicated comparators, projections and tools to combine them and to solve common related problems.

All the functions and classes in cpp-sort that take comparison or projection functions as parameters expect Callable parameters, which correspond to anything that can be used as the first parameter of std::invoke. This allows to pass entities such as pointers to members or pointer to member functions to the sorting algorithms; it should work out-of-the-box without any wrapping needed on the user side.

LWG3031

Sorters and adapters in the library accept comparators taking their parameters by non-const reference, and should work as expected as long as comparators do not actually modify their parameters in a way that affects the comparison result. This is mostly meant to support legacy comparators, but it also covers niche use cases such as when a comparator needs to "mark" the objects that have been compared in an intrusive fashion.

This additional guarantee is allowed by the resolution of LWG3031. However when a comparator can take its parameters by both const and non-const reference, it is required to return consistent results no matter which overload is used (see the LWG issue for an example of inconsistent results).

New in version 1.7.0

Clone this wiki locally