9 Aralık 2019 Pazartesi

STL Veri Yapısı - unordered_map

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.
#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.
std::unordered_map<size_t, size_t> map;
unsigned val_1 = 0, val_2 = 0;
map.emplace(key, val_1);
Örnek - int + pair
Elimizde şö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));
Örnek - int + unique_ptr
Şöyle yaparız.
std::unordered_map<int, std::unique_ptr<Foo>> map;
map.emplace(5, std::make_unique<Foo>());
Örnek - string + std::function
std::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 metodu
find() 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.
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"));
Örnek
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 [] metodu
Metodun 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.
std::unordered_map<size_t, size_t> map;
umap.reserve(24);
Bucket Interface
unordered_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