C++ std -- functional
Various components inside header <functional>
.
std::less and std::greater
These are two structs with trivial implementation of operator()
. It relies on the value type to implement operator<
or be a primitive type such as int
.
Let’s how std containers implement operator<
. Before that, let’s quickly take a look at std::lexicographical_compare. The implementation basically says that it compares two containers from left to right until it finds a[i] < b[i]
or a
is shorter than b
.
First, let’s check std::array
. The definition is here. It basically calls std::lexicographical_compare
. However, we need to be cautious that this comparator is defined only for the same array type. The signature is operator<(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
not operator<(const array<_Tp, _Size>& __x, const array<_Tp2, _Size2>& __y)
. Both the type and size should be the same, otherwise, you will see a compilation error.
Second, let’s check std::vector
. The definition is here. Similar to std::array
. The two vectors should have the same type. However, it allows to have different size. Namely std::vector<int>{1, 2} < std::vector<int>{1, 2, 1}
.
Third, std::pair
. OK. it has its own implementation, but still trivial enough.
Forth, std::tuple
. It uses a SFINAE trick implementation.