11 Aralık 2020 Cuma

std::less

std::less ile Pointer Karşılaştırma
Açıklaması şöyle. std::less pointer tiple için bir specialization sunuyor.
Using std::less<>, std::greater<> and so on will work with any pointer type, and will give consistent results, even if the result of the respective built-in operator is unspecified:
Açıklaması şöyle
A specialization of std::less for any pointer type yields a strict total order, even if the built-in operator< does not. The strict total order is consistent among specializations of std::less, std::greater, std::less_equal, and std::greater_equal for that pointer type, and is also consistent with the partial order imposed by the corresponding built-in operators (<, >, <= and >=).
Açıklaması şöyle
Note: Do mind that std::less guarantees a total order; meaning that even if the result, when using the function object, is unspecified, it must yield the same unspecified value on each invocation.
Örnek
Altta std::less kullanıldığı için şöyle yapabiliriz
std::map<void *, int> myMap;
Örnek
Burada < operator sırayı garanti etmediği halde, std::less garanti eder. Şu kod çalışır
int a, b;

///// not guaranteed to pass
assert((&a < &b) == (&a < &b));

///// guaranteed to pass
std::less<int*> lss1;
assert(lss1(&a, &b) == lss1(&a, &b));
Örnek
Şu kod çalışır
void f() { }
void g() { }

///// not guaranteed to pass
assert((&f < &g) == (&f < &g));

///// guaranteed to pass
std::less<void(*)()> lss2;
assert(lss2(&f, &g) == lss2(&f, &g));
Örnek
Elimizde şöyle bir kod olsun. Bu karşılaştırma her zaman tutarlı (aynı) bir sonuç döner, ancak ne döneceği belli değil
std::less<Object *> lessPtr;
Object * o = new Object();
assert(lessPtr (o, nullptr) == false);

Hiç yorum yok:

Yorum Gönder