Giriş
Diğer bütün programlama dillerinde HashMap olarak bilinen veri yapısı C++11 'de unordered_map olarak isimlendirilmiş. Kullanmak için şu satır dahil edilir.
İçeride value node'lar da birbirlerine pointer ile bağlanmış durumda. Bunu sebebi ise unordered_map veriyapısının O(1) de dolaşılmasının gerekmesi.
Tanımlama
unordered_map Tanımlama yazısına taşıdım.
Diğer bütün programlama dillerinde HashMap olarak bilinen veri yapısı C++11 'de unordered_map olarak isimlendirilmiş. Kullanmak için şu satır dahil edilir.
#include<unordered_map>
Veriyapısının İçiİçeride value node'lar da birbirlerine pointer ile bağlanmış durumda. Bunu sebebi ise unordered_map veriyapısının O(1) de dolaşılmasının gerekmesi.
Tanımlama
unordered_map Tanımlama yazısına taşıdım.
Diğer Metodlar
emplace metodu - Parametreler
Örnek - size_t + size_t
Şöyle yaparız.
Elimizde şöyle bir map olsun
Örnek - int + unique_ptr
Şöyle yaparız.
std::unordered_map yapısını factory olarak kullanmak isteyelim. Şöyle yaparız.
find() metodu verilen anahtar değerine göre arar ve bir itetator döndürür. Örnek:
Örnek
Elimizde şöyle bir map olsun
Şöyle yaparız. Bunun faydası ne bilmiyorum.
Metodun içi şöyle
Şöyle yaparız. Olmayan key değeri için value tarafına "Value Initialization" yapar.
Şöyle yaparız.
emplace metodu - Parametreler
Örnek - size_t + size_t
Şöyle yaparız.
std::unordered_map<size_t, size_t> map;
unsigned val_1 = 0, val_2 = 0;
map.emplace(key, val_1);
Örnek - int + pairElimizde şöyle bir map olsun
typedef std::unordered_map<int, std::pair<int, int> > map;
Şöyle yaparız.map.emplace(1, std::make_pair(2, 5));
Şöyle yaparız.
std::unordered_map<int, std::unique_ptr<Foo>> map;
map.emplace(5, std::make_unique<Foo>());
Örnek - string + std::functionstd::unordered_map yapısını factory olarak kullanmak isteyelim. Şöyle yaparız.
std::unordered_map<std::string, std::function<Foo *()>>& getFactory() {
static std::unordered_map<std::string, std::function<Foo *()>> FooFactory;
return FooFactory;
}
Fatory yapısına eklemek için şöyle yaparız.void registerFoo(std::string name, std::function<Foo *()> factory)
{
getFactory().emplace(name, factory);
}
Çağırmak için şöyle yaparız.registerFoo("foobaz", []() { return new FooBaz(); });
find metodufind() metodu verilen anahtar değerine göre arar ve bir itetator döndürür. Örnek:
std::unordered_map<std::string,double> mymap = {
{"mom",5.4},
{"dad",6.1},
{"bro",5.9} };
std::unordered_map<std::string,double>::const_iterator got = mymap.find ("mom");
insert metodu - pair
Parametre olarak pair alır. Pair şöyledir.
Elimizde şöyle bir map olsun.
std::pair<K const, V>Şöyle de düşünülebilir.
std::unordered_map<K,V>::value_typeÖrnek
Elimizde şöyle bir map olsun.
unordered_map<string, string> cats;
Eklemeyi şöyle yaparız.
cats.insert(std::make_pair("Adam", "Streak"));
veya şöyle yaparız.
cats.insert(std::pair<std::string, std::string>("Adam", "Streak"));
Elimizde şöyle bir map olsun
typedef std::unordered_map<int, std::pair<int, int> > reference_map;
Şöyle yaparız.refmap.insert(std::make_pair(1, std::make_pair(2, 5)));
insert metodu - iterator + pairŞöyle yaparız. Bunun faydası ne bilmiyorum.
std::map<key_t, value_t> cache_map_t;
cache_map_t::const_iterator it = ...;
m_table.insert (it, std::make_pair(key,value) );
operator [] metoduMetodun içi şöyle
T& operator[](const key_type& k)
{
return try_emplace(k).first->second;
}
ÖrnekŞöyle yaparız. Olmayan key değeri için value tarafına "Value Initialization" yapar.
std::unordered_map<int, int> map;
return map[42]; // is this guaranteed to return 0?
ÖrnekŞöyle yaparız.
unordered_map<Foo, int> dict;
Foo f;
f.id = 123;
dict[f] = 1;
reserve metodu
Şöyle yaparız.
unordered_map bir bucket interface sağlıyor.
buckets_count metodu
Şöyle yaparız.
std::unordered_map<size_t, size_t> map;
umap.reserve(24);
Bucket Interfaceunordered_map bir bucket interface sağlıyor.
buckets_count metodu
Şöyle yaparız.
auto buckets = map.buckets_count();
for (decltype(buckets) i = 0; i < buckets; ++i)
if (map.bucket_size(i)==0) {...}
Indeksini bildiğimiz bir bucket şöyle dolaşılabilir.for ( auto it = u_map.begin(bucket_num); it!= u_map.end(bucket_num); ++it)
{
cout<<it->first<<", "<<it->second<<endl;
}
bucket_size metodu
Şöyle yaparız.if (map.bucket_size(i)==0) {...}
Hiç yorum yok:
Yorum Gönder