C++ Sırasız Harita nasıl kullanılır?

How Use C Unordered Map



İlişkisel dizi olarak da bilinen bir harita, her öğenin bir anahtar/değer çifti olduğu bir öğe listesidir. Yani her anahtar bir değere karşılık gelir. Sıradan çalışma için farklı anahtarlar aynı değere sahip olabilir. Örneğin, anahtarlar meyvelerin bir listesi ve karşılık gelen değerler, meyvelerin renkleri olabilir. C++'da harita, üye işlevler ve operatörler ile bir veri yapısı olarak uygulanır. Sıralı bir harita, eleman çiftlerinin anahtarlarla sıralandığı haritadır. Sırasız bir harita, düzenin olmadığı bir haritadır. Bu makale, unordered_map olarak yazılmış C++ sırasız haritasının nasıl kullanılacağını açıklar. Bu makaleyi anlamak için C++ işaretçileri bilgisine ihtiyacınız var. unordered_map, C++ standart kitaplığının bir parçasıdır.

Sınıf ve Nesneler

Sınıf, değişkenlerin atanmış değerlerinin olmadığı, birlikte çalışan bir dizi değişken ve işlevdir. Değişkenlere değerler atandığında, sınıf bir nesne haline gelir. Aynı sınıfa verilen farklı değerler farklı nesnelerle sonuçlanır; yani, farklı nesneler, farklı değerlere sahip aynı sınıftır. Bir sınıftan bir nesne yaratmanın, nesneyi somutlaştırmak olduğu söylenir.







İsim, unordered_map, bir sınıftır. unordered_map sınıfından oluşturulan bir nesnenin programcı tarafından seçilen bir adı vardır.



Sınıftan bir nesneyi başlatmak için bir sınıfa ait bir fonksiyona ihtiyaç vardır. C++'da bu işlev, sınıfın adıyla aynı ada sahiptir. Sınıftan oluşturulan (örneklenen) nesneler, programcı tarafından kendilerine verilen farklı isimlere sahiptir.



Sınıftan bir nesne oluşturmak, nesneyi oluşturmak anlamına gelir; aynı zamanda somutlaştırmak demektir.





unordered_map sınıfını kullanan bir C++ programı, dosyanın en üstünde aşağıdaki satırlarla başlar:

#Dahil etmek
#Dahil etmek
ad alanı std kullanarak;

İlk satır giriş/çıkış içindir. İkinci satır, programın unordered_map sınıfının tüm özelliklerini kullanmasına izin vermektir. Üçüncü satır, programın standart ad alanındaki adları kullanmasına izin verir.



Bir Fonksiyonu Aşırı Yüklemek

İki veya daha fazla farklı fonksiyon imzası aynı ada sahip olduğunda, bu ismin aşırı yüklendiği söylenir. Bir işlev çağrıldığında, argümanların sayısı ve türü, gerçekte hangi işlevin yürütüleceğini belirler.

İnşaat/Kopya İnşaat

Basit İnşaat

Sırasız bir harita aşağıdaki gibi oluşturulabilir ve değerler atanabilir:

unordered_map<const karakter*, const karakter*>umap;

umap['muz'] = 'sarı';
umap['üzüm'] = 'Yeşil';
umap['incir'] = 'Mor';

Bildirim, anahtar ve değer çiftleri için türlerle şablon uzmanlaşmasıyla başlar. Bunu, programcının harita için seçtiği isim takip eder; sonra noktalı virgül. İkinci kod bölümü, anahtarlarına nasıl değer atanacağını gösterir.
Initializer_list tarafından inşa
Bu şöyle yapılabilir:

unordered_map<const karakter*, const karakter*>umap({{'muz', 'sarı'},
{'üzüm', 'Yeşil'}, {'incir', 'Mor'}});

Initializer_list atayarak oluşturma
Örnek:

unordered_map<const karakter*, const karakter*>umap= {{'muz', 'sarı'},
{'üzüm', 'Yeşil'}, {'incir', 'Mor'}};

Başka bir unordered_map kopyalayarak inşaat
Örnek:

unordered_map<const karakter*, const karakter*>umap1({{'muz', 'sarı'},
{'üzüm', 'Yeşil'}, {'incir', 'Mor'}});
unordered_map<const karakter*, const karakter*>umap2(umap1);

çift ​​Eleman

Aşağıdaki kod, çift öğesinin nasıl oluşturulacağını ve bunlara nasıl erişileceğini gösterir:

çift<karakter, const karakter*>pr= {'NS', 'olmak'};
maliyet<<pr.ilk << ' ';
maliyet<<pr.ikinci << ' ';

Çıktı:

NS
olmak

birinci ve ikinci, çiftteki iki öğe için ayrılmış kelimelerdir. Çiftteki değerler hala birinci ve ikinci kullanılarak değiştirilebilir.

Sırasız haritanın başlığında bir değer_tipi çifti çağrılır.

unordered_map Öğe Erişimi

mapped_type& operatörü[](key_type&& k)
Karşılık gelen anahtarın değerini döndürür. Örnek:

unordered_map<const karakter*, const karakter*>umap;

umap['muz'] = 'sarı';
umap['üzüm'] = 'Yeşil';
umap['incir'] = 'Mor';

const karakter *sağ=umap['üzüm'];

maliyet<<sağ<<' ';

Çıktı: yeşil. Değerler aynı şekilde atanabilir – yukarıya bakın.

unordered_map Kapasite

size_type size() const noexcept
Haritadaki çift sayısını döndürür.

unordered_map<const karakter*, const karakter*>umap;

umap['muz'] = 'sarı';
umap['üzüm'] = 'Yeşil';
umap['incir'] = 'Mor';

maliyet<<umap.boy() <<' ';

Çıktı 3'tür.

bool boş() const noexcept

Haritanın çifti yoksa true için 1, çiftleri varsa false için 0 döndürür. Örnek:

unordered_map<const karakter*, const karakter*>umap;
maliyet<<umap.boş() <<' ';

Çıktı 1'dir.

Dönen Yineleyiciler ve sırasız harita Sınıfı

Yineleyici bir işaretçi gibidir ancak işaretçiden daha fazla işlevselliğe sahiptir.

start() noexcept

Aşağıdaki kod kesiminde olduğu gibi, harita nesnesinin ilk çiftine işaret eden bir yineleyici döndürür:

unordered_map<const karakter*, const karakter*>umap;

umap['muz'] = 'sarı';umap['üzüm'] = 'Yeşil';umap['incir'] = 'Mor';

unordered_map<const karakter*, const karakter*> ::yineleyiciyineleme=umap.başlamak();
çift<const karakter*, const karakter*>pr= *yineleme;
maliyet<<pr.ilk << ',' <<pr.ikinci << ' ';

Çıktı: incir, mor. Harita sıralanmamış.

start() const noexcept;

Harita nesnesi koleksiyonunun ilk öğesine işaret eden bir yineleyici döndürür. Nesne yapısından önce const olduğunda, start() yerine startup() const ifadesi yürütülür. Bu koşul altında, nesnedeki öğeler değiştirilemez. Örneğin aşağıdaki kodda kullanılır.

constunordered_map<const karakter*, const karakter*>umap({{'muz', 'sarı'},
{'üzüm', 'Yeşil'}, {'incir', 'Mor'}});

unordered_map<const karakter*, const karakter*> ::const_iteratoryineleme=umap.başlamak();
çift<const karakter*, const karakter*>pr= *yineleme;
maliyet<<pr.ilk << ',' <<pr.ikinci << ' ';

Çıktı: incir, mor. Harita sıralanmamış. Döndürülen yineleyiciyi almak için bu sefer yalnızca yineleyici yerine const_iterator kullanıldığını unutmayın.

end() noexcept

Harita nesnesinin son öğesinin hemen ötesine işaret eden bir yineleyici döndürür.

end() const noexcept

Harita nesnesinin son öğesinin hemen ötesine işaret eden bir yineleyici döndürür. Harita nesnesi yapısından önce const olduğunda, end() yerine end() const ifadesi yürütülür.

unordered_map İşlemleri

yineleyici bul(const key_type& k)

Haritada verilen anahtarın bir çiftini arar. Bulunursa, yineleyiciyi döndürür. Bulunamazsa, haritanın bir çift olmayan sonuna işaret eden bir yineleyici döndürür. Aşağıdaki kod, bu üye işlevinin nasıl kullanılacağını gösterir:

unordered_map<karakter,karakter>umap;

umap['ile'] = 'B';umap['C'] = 'NS';umap['Ve'] = 'F';

unordered_map<karakter,karakter> ::yineleyiciyineleme=umap.bulmak('C');
Eğer (umap.bulmak('C') ! =umap.son())
{
çift<karakter,karakter>pr= *yineleme;
maliyet<<pr.ilk << ',' <<pr.ikinci << ' ';
}

Çıktı: c, d

const_iterator bul(const key_type& k) const;

İşlevin bu sürümü, sırasız haritanın oluşturulması const ile başlıyorsa, haritanın tüm öğelerini salt okunur hale getirerek çağrılır.

unordered_map Değiştiriciler

çift ​​ekleme(değer_tipi&& nesne)
Sırasız bir harita, çiftlerin herhangi bir sırada olmadığı anlamına gelir. Böylece program çifti uygun bulduğu herhangi bir yere yerleştirir. İşlev döner, çift. Ekleme başarılı olursa, bool true için 1 olur, aksi takdirde false için 0 olur. Ekleme başarılı olursa, yineleyici yeni eklenen öğeye işaret eder. Aşağıdaki kod kullanımı göstermektedir:

unordered_map<const karakter*, const karakter*>umap;

umap['muz'] = 'sarı';
umap['üzüm'] = 'Yeşil';
umap['incir'] = 'Mor';

umap.sokmak({{'Kiraz', 'ağ'}, {'çilek', 'ağ'}});

maliyet<<umap.boy() << ' ';

Çıktı: 5. Birden fazla çift eklenebilir.

size_type silme(const key_type& k)

Bu işlev, unordered_map'ten bir çifti siler. Aşağıdaki kod segmenti şunları gösterir:

unordered_map<const karakter*, const karakter*>umap;

umap['muz'] = 'sarı';
umap['üzüm'] = 'Yeşil';
umap['incir'] = 'Mor';

intbirde=umap.silmek('üzüm');

maliyet<<umap.boy() << ' ';

Çıktı 2'dir.
geçersiz takas(unordered_map&)
Bu kod bölümünde gösterildiği gibi, iki sırasız harita değiştirilebilir:

unordered_map<const karakter*, const karakter*>umap1= {{'muz', 'sarı'},
{'üzüm', 'Yeşil'}, {'incir', 'Mor'}, {'çilek', 'ağ'}};

unordered_map<const karakter*, const karakter*>umap2= {{'Kiraz', 'ağ'}, {'Misket Limonu', 'Yeşil'}};

umap1.takas(umap2);

unordered_map<const karakter*, const karakter*> ::yineleyiciiter1=umap1.başlamak();
çift<const karakter*, const karakter*>pr1= *iter1;
unordered_map<const karakter*, const karakter*> ::yineleyiciiter2=umap2.başlamak();
çift<const karakter*, const karakter*>pr2= *iter2;

maliyet<< 'Umap1'in ilk anahtarı ve boyutu:'<<pr1.ilk <<','<<umap1.boy() << ' ';
maliyet<< 'umap2'nin ilk anahtarı ve boyutu'<<pr2.ilk <<','<<umap2.boy() << ' ';
unordered_map<const karakter*, const karakter*>umap1= {{'muz', 'sarı'},
{'üzüm', 'Yeşil'}, {'incir', 'Mor'}, {'çilek', 'ağ'}};
unordered_map<const karakter*, const karakter*>umap2= {{'Kiraz', 'ağ'}, {'Misket Limonu', 'Yeşil'}};

umap1.takas(umap2);

unordered_map<const karakter*, const karakter*> ::yineleyiciiter1=umap1.başlamak();
çift<const karakter*, const karakter*>pr1= *iter1;
unordered_map<const karakter*, const karakter*> ::yineleyiciiter2=umap2.başlamak();
çift<const karakter*, const karakter*>pr2= *iter2;

maliyet<< 'Umap1'in ilk anahtarı ve boyutu:'<<pr1.ilk <<','<<umap1.boy() << ' ';
maliyet<< 'umap2'nin ilk anahtarı ve boyutu'<<pr2.ilk <<','<<umap2.boy() << ' ';

Çıktı:

umap1'in ilk anahtarı ve boyutu: lime, 2

İlk anahtar ve umap2 çilek boyutu, 4

Harita sıralanmamış. Gerekirse haritanın uzunluğunun artırıldığını unutmayın. Veri türleri aynı olmalıdır.

Sınıf ve Örneklenmiş Nesneleri

Örneklenmiş bir nesne bir sınıf için olduğu gibi, bir değer de bir veri tipi içindir. Sırasız harita yapısı, bir sınıfı veri tipi olarak da kabul edebilir. Aşağıdaki program bunu göstermektedir:

#Dahil etmek
#Dahil etmek
ad alanı std kullanarak;

sınıf TheCla
{
halka açık:
intbirde;
statik karakterch;

geçersizişlev(karakternumara, const karakter *P)
{
maliyet<< 'Var ' <<birde<< 'kitapların değeri' <<numara<<P<< ' mağazada.' << ' ';
}
statik geçersizeğlence(karakterch)
{
Eğer (ch== 'ile')
maliyet<< 'Resmi statik üye işlevi' << ' ';
}
};

intana()
{
TheCla nesnesi1;TheCla nesnesi2;TheCla nesnesi3;TheCla nesnesi4;TheCla nesnesi;

unordered_map<const karakter*,TheCla>umap;
umap= {{'muz',nesne1}, {'üzüm',obj2}, {'incir',obj3}, {'çilek',obj4}, {'Misket Limonu',obj5}};

maliyet<<umap.boy() << ' ';

dönüş 0;
}

Çıktı: 5.

Sınıf tanımının iki veri genel üyesi ve iki genel üye işlevi vardır. main() işlevinde, sınıf için farklı nesneler başlatılır. Daha sonra, her bir çiftin bir meyvenin adından ve sınıftan bir nesneden oluştuğu sırasız bir harita oluşturulur. Haritanın boyutu görüntülenir. Program hiçbir uyarı veya hata mesajı olmadan derlenir.

Haritanın Uygulanması

Dizi, bir dizini değerle ilişkilendirir. Anahtar/değer çiftleri, hayatta birçok durumda programlanabilen mevcuttur. Anahtar/değer çifti meyve/renk sadece bir örnektir. Başka bir örnek, insanların adları ve yaşlarıdır. Bu durumda, çift bir tür çift olacaktır. Çift de olabilir. İkinci durumda, ön işleme yönergesi kullanılacaktır. Bir anahtar/değer çifti hala evli çiftlerin adı olabilir. Çok eşliliğin olduğu ülkelerde bir erkeğe farklı eşler olacaktır.

Haritanın Oluşturulması

Bir harita, iki sütunlu iki boyutlu bir dizi değildir. Bir harita, bir karma işleviyle çalışır. Anahtar, karma işlevi tarafından bir dizinin tamsayısına kodlanır. Değerleri tutan bu dizidir. Yani aslında değerlere sahip bir dizi var ve anahtarlar dizinin indekslerine eşleniyor ve böylece anahtarlar ve değerler arasındaki yazışmalar yapılıyor. Hashing kapsamlı bir konudur ve bu makalede ele alınmamıştır.

Çözüm

İlişkisel dizi olarak da bilinen bir harita, her öğenin bir anahtar/değer çifti olduğu bir öğe listesidir. Yani her anahtar bir değere karşılık gelir. C++'da harita, üye işlevler ve operatörler ile bir veri yapısı olarak uygulanır. Sıralı bir harita, eleman çiftlerinin anahtarlarla sıralandığı haritadır. Sırasız bir harita, sıralamanın olmadığı bir haritadır.

Teknik olarak, bir karma, çift öğelerden oluşur. Aslında çift, üye fonksiyonları ve operatörleri ile bütün bir veri yapısıdır. Çift için iki şablon parametresi, unordered_map için aynı iki şablon parametresidir.

Harita için initializer_list, değişmezlerin bir dizi değişmezidir. Her dahili sabit değer, anahtar/değer çifti olmak üzere iki nesneden oluşur.

unordered_map için üye işlevleri ve operatörleri şu başlıklar altında kategorize edilebilir: unordered_map inşa/kopya oluşturma, unordered_map Capacity, unordered_map yineleyici, unordered_map İşlemleri ve unordered_map Değiştiriciler.

Bir anahtarın bir değere eşlenmesi gerektiğinde sırasız bir harita kullanılır.

Chrys