C Gömülü Programlama konularımız yayında...
Map sınıfı, benzersiz anahtarların belirli değerlerle eşleşdiği bir ilişkisel konteynerdir. Map, içinde anahtar/değer ikililerinden oluşan bir liste yer alır. Anahtar bir ismi ifade eder ve bu isim karşılığında bir değer yer alır. Anahtar adını kullanarak kaydettiğimiz bir değeri, yine anahtar adını kullanarak okuyabiliriz.
Map içinde yer alan anahtar/değer ikililerindeki değeri, anahtar adını kullanarak okuyabilmemiz için, tüm anahtar ifadeleri benzersiz olmalıdır.
Bir map sınıfı için şablon bildiriminin genel yapısı aşağıda gösterilmektedir:
template <class Key, class T, class Comp = less<Key>, class Allocator = allocator<pair<const key, T>> class map
Key: Anahtarların veri türüdür.
T: Map'e kaydedilen veri türünü gösterir.
Comp: İki anahtar karşılaştıran fonksiyonu gösterir.
allocator: Tahsis ediciyi ifade eder.
Map konteynerleri aşağıdaki constructor fonksiyonlarını içerir:
explicit map(const Comp &cmpfn = Comp(), const Allocator &a = Allocator());
map(const map<Key, T, Comp, Allocator> &ob);
template <class InIter> map(InIter start, InIter end, const Comp &cmpfn = Comp(), const Allocator &a = Allocator());
İlk yapı boş bir map oluşturur. İkinci yapı, ob nesnesi ile aynı elemanlara sahip bir map oluşturur. Üçüncü yapı, start ve end tekrarlayıcıları ile gösterilen aralıktaki elemanları içeren bir map oluşturur. cmpfn ile gösterilen fonksiyon map sıralamasını belirler.
explicit map(const Comp &cmpfn = Comp(), const Allocator &a = Allocator());
map(const map<Key, T, Comp, Allocator> &ob);
template <class InIter> map(InIter start, InIter end, const Comp &cmpfn = Comp(), const Allocator &a = Allocator());
Azami esneklik ve taşınabilirlik amacıyla, bir listeye depolanacak herhangi bir nesne, varsayılan bir constructor fonksiyonu tanımlamalıdır.
Aşağıdaki işlemciler map'lerle birlikte kullanılabilir:
==, <, <=, !=, >, >=
Map sınıfı içinde tanımlanan bazı üye fonksiyonlar aşağıdaki tabloda yer almaktadır:
Üye fonksiyon | Açıklama |
---|---|
iterator begin(); const_iterator begin() const; |
Map'teki ilk elemanı gösteren bir tekrarlayıcı geri döndürür. |
void clear(); | Map'teki tüm elemanları siler. |
size_type count(const key_type &k) const; | Map'te k ile gösterilen anahtar değerinin sayısını geri döndürür (0 veya 1). |
bool empty() const; | Eğer çağıran map boş ise doğru, aksi takdirde yanlış bir değer geri döndürür. |
iterator end(); const_iterator end() const; |
Map'in sonunu gösteren bir tekrarlayıcı geri döndürür. |
iterator erase(iterator i); | Map içinde, i ile gösterilen elemanı siler. |
iterator erase(iterator start, iterator end); | Map içinde start ile end arasındaki elemanları siler. |
size_type erase(const key_type &k); | Map içinde, k ile gösterilen değere sahip elemanları siler. |
iterator find(const key_type &k); const_iterator find(const key_type &k) const; |
Tanımlanan anahtara bir tekrarlayıcı geri döndürür. Anahtar bulunamazsa, map'in sonunu gösteren bir tekrarlayıcı geri döndürür. |
iterator insert(iterator i, const value_type &val); | Map içinde, i ile gösterilen eleman yerine veya sonrasına val değerini ekler. Elemanı gösteren bir tekrarlayıcı geri döndürür. |
template <class InIter> void insert(InIter start, InIter end) | Map içinde, start ile range değerleri arasında kalan elemanları ekler. |
pair<iterator, bool> insert(const value_type &val); | Çağıran map'e val değerini ekler. Elemanı gösteren bir tekrarlayıcı geri döndürür. Eleman, sadece mevcut değilse eklenir. Eleman eklenirse, pair<iterator, true> değeri aksi takdirde pair<iterator, false> değeri geri döndürülür. |
mapped_type & operator[ ](const key_type &i); | Map içinde, i ile gösterilen elemanın referansını geri döndürür. Eleman mevcut değilse eklenir. |
size_type size() const; | Map içindeki elemanı sayısını geri döndürür. |
Anahtar/değer ikilisi map içine, aşağıda şablon yapısı verilen, pair türünde kaydedilir:
template <class Ktype, class Vtype> struct pair {
typedef Ktype first_type; // anahtar veri türü
typedef Vtype second_type; // değer veri türü
Ktype first; // anahtar içerir
Vtype second; // değer içerir
// constructor fonksiyonları
pair();
pair(const Ktype &k, const Vtype &v);
template<class A, class B> pair(const<A, B> &ob);
}
Bir ikili değer oluşturmak için pair constructor fonksiyonlarından birisini veya aşağıda genel yapısı verilen make_pair() fonksiyonunu kullanabiliriz.
template <class Ktype, class Vtype> pair<Ktype, Vtype> make_pair(const Ktype &k, const Vtype &v);
Fonksiyon, Ktype ve Vtype tarafından gösterilen veri türlerinden oluşan bir ikili nesne geri döndürür. Bu fonksiyonun avantajı, depolanan nesnelerin türlerinin, derleyici tarafından otomatik olarak belirlenmesidir.
Şimdi, bir map oluşturma, anahtar/değer ikililerinden oluşan elemanlar ekleme ve bu ikili değerleri ekrana yazma işlemlerini bir örnek üzerinde incelemeye çalışalım:
#include <iostream>
#include <map>
using namespace std;
int main(void)
{
// int anahtar ve string değerlerden oluşan ikililer içeren map oluşturma
map<int, string> Personel;
// insert() fonksiyonu ile map'e anahtar/değer ikilileri ekleme
Personel.insert(pair<int, string>(1, "Ahmet Sakin"));
Personel.insert(pair<int, string>(2, "Ayşe Saygılı"));
Personel.insert(pair<int, string>(3, "Mehmet Efendi"));
Personel.insert(pair<int, string>(4, "Kadir Mütevazi"));
Personel.insert(pair<int, string>(5, "Ekrem Vefalı"));
cout << "Map eleman sayısı: " << Personel.size() << "\n";
// [ ] işlemcisi ile map'e anahtar/değer ikilileri ekleme
Personel[Personel.size()+1] = "Murat Yardımcı";
Personel[Personel.size()+1] = "Esra Sadıker";
Personel[Personel.size()+1] = "Öner Erdemli";
cout << "Map eleman sayısı: " << Personel.size() << "\n\n";
// Map elemanlarını ekrana yazma
cout << "Map elemanları:" << "\n";
cout << "---------------" << "\n";
map<int, string>::iterator mp;
for(mp=Personel.begin(); mp!=Personel.end(); mp++) {
cout << (*mp).first << ": " << (*mp).second << "\n";
}
return 0;
}
Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:
Map eleman sayısı: 5 Map eleman sayısı: 8 Map elemanları: --------------- 1: Ahmet Sakin 2: Ayşe Saygılı 3: Mehmet Efendi 4: Kadir Mütevazi 5: Ekrem Vefalı 6: Murat Yardımcı 7: Esra Sadıker 8: Öner Erdemli
Program, int veri türünden anahtar ve string veri türünden değer içeren ikililerden oluşan Personel adlı bir map bildirimi yapar. insert() fonksiyonunu kullanarak, map'e beş eleman ekler. size() fonksiyonu ile map eleman sayısını ekrana yazar. [ ] işlemcisini kullanarak, map'e üç eleman daha ekler ve map eleman sayısını tekrar ekrana yazar. Bir for döngüsü içinde, Personel map elemanlarını sırasıyla bir tekrarlayıcıya atayarak, anahtar ve değer ikilisini ekrana yazar.
Bir map oluştururken, anahtar ve değer ikililerinden oluşan ilk değerler vererek eleman ekleyebiliriz.
Şimdi, ilk değer vererek bir map oluşturma işlemini bir örnek üzerinde incelemeye çalışalım:
#include <iostream>
#include <map>
using namespace std;
int main(void)
{
// İlk değer verilerek int anahtar ve string değerlerden oluşan ikililer içeren map oluşturma
// C++11
map<int, string> Personel = {
{1, "Ahmet Sakin"},
{2, "Ayşe Saygılı"},
{3, "Mehmet Efendi"}
};
// Map elemanlarını ekrana yazma
cout << "Map elemanları:" << "\n";
cout << "---------------" << "\n";
map<int, string>::iterator mp;
for(mp=Personel.begin(); mp!=Personel.end(); mp++) {
cout << (*mp).first << ": " << (*mp).second << "\n";
}
return 0;
}
Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:
Map elemanları: --------------- 1: Ahmet Sakin 2: Ayşe Saygılı 3: Mehmet Efendi
Program, int veri türünden anahtar ve string veri türünden değer içeren ikililerden oluşan Personel adlı bir map bildirimi yapar. Map oluştururken ilk değer atama yöntemiyle, map'e beş eleman ekler. Bir for döngüsü içinde, Personel map elemanlarını sırasıyla bir tekrarlayıcıya atayarak, anahtar ve değer ikilisini ekrana yazar.