std::unordered_set'te std::pair Kullanımı

Bazı durumlarda, std::pair'lerden oluşan std::unordered_set veya std::unordered_map kullanmak isteyebilirsiniz.


Ancak, std::pair öntanımlı olarak hash'lenebilir değildir, bu nedenle aşağıdaki kod parçacığı çalışmayacaktır:

#include <unordered_set>
int main(void) {
std::unordered_set<std::pair<int, int>> test;
}
view raw main.cpp hosted with ❤ by GitHub

İnternette bir pairhash sınıfı tanımlamak ve std::unordered_set veya std::unordered_map'e şablon parametresi olarak bu hash fonksiyonunu vermek önerilerine denk gelebilirsiniz.

Bu kötü bir fikir değildir. Aslında başkalarınca da kullanılacak bir kütüphane yazıyorsanız muhtemelen bunu yapmalısınız. Ama bazı durumlar için daha iyisi yapılabilir...

Yukarıdaki kod parçacığını değiştirmeye gerek kalmadan çalışmasını sağlamak için kodumuza aşağıdaki gibi bir ekleme yapmamız yeterlidir:

namespace std {
template<typename X, typename Y>
struct hash<std::pair<X, Y>> {
std::size_t operator()(const std::pair<X, Y> &pair) const {
return std::hash<X>()(pair.first) ^ std::hash<Y>()(pair.second);
}
};
}
view raw template.cpp hosted with ❤ by GitHub

Bu, epey sade bir kod ortaya çıkarmamızı sağlar:

#include <unordered_set>
namespace std {
template<typename X, typename Y>
struct hash<std::pair<X, Y>> {
std::size_t operator()(const std::pair<X, Y> &pair) const {
return std::hash<X>()(pair.first) ^ std::hash<Y>()(pair.second);
}
};
}
int main(void) {
std::unordered_set<std::pair<int, int>> test;
}
view raw final.cpp hosted with ❤ by GitHub

Ancak, bunu yeniden kullanılabilecek bir kütüphanede yapmaktan kaçınmak iyi olabilir, çünkü std::pair için bir hash işlevi tanımlamak için habersizce benzer bir hile yapan olursa kod çakışmasına neden olabilir. Ayrıca yeni bir C++ standardı std::pair için hash fonksiyonu sunmaya başlarsa da sorun olacaktır.

Tüm bunlara rağmen, bu yazıda bahsedilen kullanım programlama yarışmaları veya ödevlerde işinize yarayacaktır. En azından benim yaradı :)

Kaynak
Ek Okuma

Yorumlar

Bu blogdaki popüler yayınlar

Mızıka Tabları Nasıl Okunur

Muhtar Kellesi

Müfettiş Gadget'taki Kötü Adamın Yüzü Açığa Çıkmış