Skip to content

Comparators and projections

Morwenn edited this page Jan 30, 2021 · 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.

Related utilities

Several of the miscellaneous utilities provided by the library are meant to interact with comparators and projections:

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 sort consistency. This is mostly meant to support legacy comparators, but it also covers more unusual use cases such as when a comparator needs to update the compared objects to store additional information (preferably fields that do not affect the result of the comparison).

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