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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <unordered_set> | |
int main(void) { | |
std::unordered_set<std::pair<int, int>> test; | |
} |
İ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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
}; | |
} |
Bu, epey sade bir kod ortaya çıkarmamızı sağlar:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} |
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
Yorum Gönder
sen de yaz yaz yaz buraya yaz bütün sözlerini