Haritada C++ Standart Şablon Kitaplığı (STL)

⚡ Akıllı Özet

Haritada C++ Standart Şablon Kütüphanesinden gelen, öğeleri sıralı anahtar-değer çiftleri olarak depolayan, her benzersiz anahtarın bir değere karşılık geldiği ve hızlı arama, ekleme ve sıralı gezinmeyi sağlayan ilişkisel bir kapsayıcıdır.

  • 🗺️ İlişkisel kap: A C++ Harita, öğeleri benzersiz ve otomatik olarak sıralanmış anahtarlara sahip anahtar-değer çiftleri olarak saklar.
  • 🧩 Başlık ve sözdizimi: Harita başlığını ekleyin, ardından std::map'i tanımlayın. Tür belirtilmiş çiftleri saklamak için kullanılan ad.
  • Yerleşik işlevler: begin(), size(), empty(), insert(), find(), erase() ve clear() fonksiyonları harita içeriğini yönetir.
  • 🔄 yineleme: Çift yönlü bir yineleyici, okuma veya silme işlemleri için harita öğelerini sıralı anahtar düzeninde dolaşır.
  • 🔑 Benzersiz anahtarlar: İki öğe aynı anahtarı paylaşamaz; bu da haritayı ilişkilendirici dizi olarak ideal kılar.
  • 🤖 Yapay zeka yardımı: GitHub Copilot ve benzeri yapay zeka asistanları, kısa bir yorumdan harita bildirimleri ve döngüler oluşturur.

Haritada C++ STL

Harita Nedir? C++?

In C++MAP, eşlenmiş biçimde öğeleri depolayan ilişkilendirici bir kapsayıcıdır. Haritadaki her öğe bir anahtar değer ve bir eşlenmiş değerden oluşur. İki eşlenmiş değer aynı anahtar değerleri paylaşamaz.

Anahtar değerler, öğeleri benzersiz bir şekilde sıralamak ve tanımlamak için kullanışlıdır; eşlenmiş değerler ise her anahtarla ilişkili içeriği saklar. İkisi tür olarak farklı olabilir, ancak üye türü bunları her ikisini de içeren bir çift halinde birleştirir.

Herhangi bir kod yazmadan önce, neden harita (map) yapısının sıklıkla doğru bir seçim olduğunu bilmek faydalı olacaktır.

Neden std::map kullanıyorsunuz?

Harita kullanmanın nedenleri şunlardır:

  • `std::map` yalnızca benzersiz anahtarları, seçilen sıralama kriterlerine göre sıralı bir şekilde saklar.
  • Anahtar kelime kullanarak öğeleri aramak kolay ve hızlıdır.
  • Her tuşa yalnızca bir öğe eklenmiştir.
  • std::map ilişkisel bir dizi olarak kullanılabilir.
  • std::map, dengeli ikili ağaçlar kullanılarak uygulanabilir.

Bu avantajlardan yararlanmak için öncelikle bildirim sözdizimiyle başlayın.

Sözdizimi

Std::map'i bildirmek için şu sözdizimini kullanın:

std::map<key_datatype, value_datatype>map_name; 
  • MKS anahtar_veri_türü harita anahtarlarının veri tipini belirtir.
  • MKS değer_veri_türü harita anahtarlarına karşılık gelen değerlerin veri tipini belirtir.
  • MKS harita_adı haritanın adıdır.

Örneğin:

map<string, int> my_map; 

my_map adında bir harita tanımladık. Bu haritanın anahtar veri tipi string, değer veri tipi ise integer olacaktır.

Üye türleri

Üye fonksiyonları, parametre veya dönüş tipi olarak aşağıdaki üye tiplerini kullanabilir:

  • anahtar türü: Anahtar (şablondaki ilk parametre)
  • eşlenen_tip: T (şablondaki ikinci parametre)
  • anahtar_karşılaştır: (Şablondaki üçüncü parametreyi) Karşılaştır
  • ayırıcı_türü: Tahsis et (şablonun dördüncü parametresi)
  • değer türü: çift
  • değer_karşılaştır: Öğeleri karşılaştırmak için iç içe geçmiş işlev sınıfı
  • referans: tahsisat_türü::referans
  • const_reference: allocator_type::const_reference
  • işaretçi: ayırıcı_tipi::işaretçi
  • const_pointer: allocator_type::const_pointer
  • yineleyici: value_type'a çift yönlü bir yineleyici
  • const_iterator: const value_type'a çift yönlü bir yineleyici
  • ters_iteratör: ters yineleyici
  • const_reverse_iterator: sürekli bir ters yineleyici
  • fark_tipi: ptrdiff_t
  • Beden Çeşidi: size_t

std::map'in Yerleşik İşlevleri

std::map yerleşik işlevlerle birlikte gelir. Bunlardan bazıları şunlardır:

  • başla () – Bu fonksiyon, haritanın ilk öğesine işaret eden yineleyiciyi döndürür.
  • boyut() – Bu fonksiyon, haritadaki öğe sayısını döndürür.
  • boş() – Bu fonksiyon, haritanın boş olup olmadığını belirten bir Boolean değeri döndürür.
  • ekle(anahtar, değer çifti) – Bu fonksiyon, haritaya yeni bir anahtar-değer çifti ekler.
  • bul(değer) – Bu fonksiyon, val öğesi bulunursa ona ait yineleyiciyi verir. Aksi takdirde m.end() değerini döndürür.
  • sil (yineleyici konumu) – Bu fonksiyon, yineleyici tarafından işaret edilen konumdaki öğeyi siler.
  • sil(const g) – Bu fonksiyon, g anahtar-değer çiftini bir haritadan siler.
  • açık() – Bu fonksiyon, haritadaki tüm öğeleri siler.

Tanımlanan fonksiyonlarla, aşağıdaki örnekler yineleme ile başlayarak bunları uygulamaya koymaktadır.

Harita Öğeleri Üzerinde Yineleme

Harita öğeleri üzerinde yineleme yapabilirsiniz. Bunun için basitçe bir yineleyici oluşturup kullanmamız gerekiyor. Örneğin:

Örnek 1

#include <iostream>
#include <string>
#include <map> 

using namespace std;
int main() {

	map<int, string> Students;

	Students.insert(std::pair<int, string>(200, "Alice"));

	Students.insert(std::pair<int, string>(201, "John"));

	cout << "Map size is: " << Students.size() << endl;

	cout << endl << "Default map Order is: " << endl;

	for (map<int, string>::iterator it = Students.begin(); it != Students.end(); ++it) {

		cout << (*it).first << ": " << (*it).second << endl;
	}
}

Çıktı:

C++ harita yinelemesi Örnek 1 çıktısı

İşte kodun ekran görüntüsü:

C++ Harita yinelemesi Örnek 1 kodu

Code Açıklama:

  1. İşlevlerini kullanmak için iostream başlık dosyasını kodumuza ekleyin.
  2. İşlevlerini kullanmak için dize başlık dosyasını kodumuza ekleyin.
  3. İşlevlerini kullanmak için harita başlık dosyasını kodumuza ekleyin.
  4. Sınıflarını çağırmadan kullanmak için std ad alanını kodumuza ekleyin.
  5. Main() işlevini çağırın. { işlevin gövdesinin başlangıcını belirtir.
  6. Anahtarların tamsayı ve değerlerin dize olacağı Öğrenciler adında bir harita oluşturun.
  7. Haritaya değerler ekleyin Öğrenciler. Haritaya 200'lük bir anahtar ve Alice'in değeri eklenecektir.
  8. Haritaya değerler ekleyin Öğrenciler. Haritaya 201 anahtarı ve John değeri eklenecektir.
  9. Öğrenciler adlı haritanın boyutunu elde etmek için size() işlevini kullanın. Bu 2 değerini döndürmelidir.
  10. Konsola bir miktar metin yazdırın.
  11. Öğrenciler adlı haritanın öğeleri üzerinde yineleme yapacak şekilde adlandırılmış bir yineleyici oluşturmak için bir for döngüsü kullanın.
  12. Öğrenciler haritasının değerlerini konsola yazdırın.
  13. For döngüsünün gövdesinin sonu.
  14. Main() işlevinin gövdesinin sonu.

Std::map'e veri ekleme

Insert() işlevini kullanarak öğeleri std::map'e girebilirsiniz. std::map anahtarlarının benzersiz olması gerektiğini unutmayın.

Öncelikle her anahtarın haritada mevcut olup olmadığını kontrol eder. Eğer mevcutsa, giriş eklenmez, ancak mevcut girişin yineleyicisini döndürür. Eğer mevcut değilse, giriş eklenir.

Fonksiyonun şu varyasyonları vardır:

  • ekle(çift) Bu varyasyonda, haritaya bir anahtar-değer çifti eklenir.
  • insert(start_itr, end_itr) – Bu varyasyonla, girdiler başka bir haritadan start_itr ve end_itr ile tanımlanan aralık içine eklenecektir.

`insert_or_assign()` fonksiyonu, `insert()` fonksiyonuyla aynı şekilde çalışır, ancak verilen anahtar haritada zaten mevcutsa, değeri değiştirilir.

Örnek 2

#include <map>
#include <iostream>

using namespace std;

int main() {

	map<int, int> m{ {1,3} , {2,4} , {3,5} };

	m.insert({ 5, 6 });
	m.insert({ 1, 8 });

	m.insert_or_assign(1, 6);  
	
	cout << "Key\tElement\n";
	for (auto itr = m.begin(); itr != m.end(); ++itr) {
		cout << itr->first << '\t' << itr->second << '\n';
	}
	return 0;
}

Çıktı:

C++ harita ekleme Örnek 2 çıktısı

İşte kodun ekran görüntüsü:

C++ Harita ekleme Örnek 2 kodu

Code Açıklama:

  1. İşlevlerini kullanmak için harita başlık dosyasını kodumuza ekleyin.
  2. İşlevlerini kullanmak için iostream başlık dosyasını kodumuza ekleyin.
  3. Sınıflarını çağırmadan kullanmak için std ad alanını kodumuza ekleyin.
  4. Main() işlevini çağırın. { işlevin gövdesinin başlangıcını belirtir.
  5. Anahtarların tam sayı, değerlerin ise tam sayı olacağı m adında bir harita oluşturun. Haritaya üç giriş yapıldı.
  6. Haritaya yeni bir giriş ekleyin m. Haritaya 5'lik bir anahtar ve 6'lık bir değer eklenecektir.
  7. Zaten mevcut bir anahtara giriş yapılmaya çalışılıyor. 1 anahtarı haritada mevcut olduğundan giriş yapılmayacaktır.
  8. Mevcut bir girişi eklemek veya değiştirmek için insert_or_sign() işlevini kullanma. 1 anahtarı zaten mevcut olduğundan değeri 6 olarak değiştirilecektir.
  9. Konsola bir miktar metin yazdırın. “\t” karakteri yatay bir boşluk oluştururken, “\n” karakteri fare imlecini bir sonraki satıra taşır.
  10. Kullanmak döngü için m adlı haritanın öğeleri üzerinde yineleme yapacak itr adında bir yineleyici oluşturmak.
  11. m haritasının değerlerini konsola yazdırın. “\t” karakteri, her tuş ile ona karşılık gelen değer arasında yatay bir boşluk oluşturur. Bunun aksine, “\n” karakteri fare imlecini her yinelemeden sonra bir sonraki satıra hareket ettirir.
  12. For döngüsünün gövdesinin sonu.
  13. Program başarılı bir şekilde tamamlandığında bir değer döndürmelidir.
  14. Main() işlevinin gövdesinin sonu.

Haritada Arama

`find()` fonksiyonunu kullanarak bir haritadaki öğeleri anahtarlarına göre arayabiliriz. Anahtar bulunamazsa, fonksiyon `std::map::end` değerini döndürür. Aksi takdirde, aranan öğenin yineleyicisi döndürülür.

Örnek 3

#include <iostream>
#include <string>
#include <map> 
using namespace std;
int main() {
	map<int, string> Students;
	Students.insert(std::pair<int, string>(200, "Alice"));
	Students.insert(std::pair<int, string>(201, "John"));
	std::map<int, string>::iterator it = Students.find(201);
	if (it != Students.end()) {
		std::cout << endl << "Key 201 has the value: => "<< Students.find(201)->second << '\n';
	}
}

Çıktı:

C++ harita bul arama Örnek 3 çıktısı

İşte kodun ekran görüntüsü:

C++ harita bul arama Örnek 3 kod

Code Açıklama:

  1. Fonksiyonlarını hata almadan kullanabilmek için iostream başlık dosyasını kodumuza ekleyin.
  2. Fonksiyonlarını hata almadan kullanabilmek için string başlık dosyasını kodumuza ekleyin.
  3. Harita başlık dosyasını hata almadan fonksiyonlarını kullanabilmek için kodumuza ekleyin.
  4. Sınıflarını çağırmadan kullanmak için std ad alanını kodumuza ekleyin.
  5. main() fonksiyonunu çağırın. {, main() işlevinin gövdesinin başlangıcını işaret eder.
  6. Anahtarları tamsayılar ve değer dizeleri olacak olan Öğrenciler adında bir harita oluşturun.
  7. Haritaya değerler ekleyin Öğrenciler. Haritaya 200'lük bir anahtar ve Alice'in değeri eklenecektir.
  8. Haritaya değerler ekleyin Öğrenciler. Haritaya 201 anahtarı ve John değeri eklenecektir.
  9. 201 anahtarıyla ilişkili değeri arayın.
  10. Anahtarın değerinin bulunup bulunmadığını kontrol etmek için bir if ifadesi kullanın.
  11. Anahtarın değerini konsoldaki bir metnin yanına yazdırın.
  12. If ifadesinin gövdesinin sonu.
  13. Main() işlevinin gövdesinin sonu.

Haritadan Veri Silme

Haritadan bir değeri silmek için delete() fonksiyonunu kullanabiliriz. Basitçe silinecek öğeyi işaret eden bir yineleyici oluştururuz. Daha sonra yineleyici, delete() işlevine aktarılır.

Örnek 4

#include <iostream>
#include <string>
#include <map>

using namespace std;
int main() {

	map<std::string, int> my_map;

	my_map.insert(std::make_pair("cow", 1));

	my_map.insert(std::make_pair("cat", 2));

	my_map["lion"] = 3;

	map<std::string, int>::iterator it = my_map.find("cat");

	my_map.erase(it);

	for (map<string, int>::iterator it = my_map.begin(); it != my_map.end(); ++it)

		cout << (*it).first << ": " << (*it).second << endl;

  return 0;
}

Çıktı:

C++ harita silme Örnek 4 çıktısı

İşte kodun ekran görüntüsü:

C++ harita silme Örnek 4 kod

Code Açıklama:

  1. İşlevlerini kullanmak için iostream başlık dosyasını kodumuza ekleyin.
  2. İşlevlerini kullanmak için dize başlık dosyasını kodumuza ekleyin.
  3. İşlevlerini kullanmak için harita başlık dosyasını kodumuza ekleyin.
  4. Sınıflarını çağırmadan kullanmak için std ad alanını kodumuza ekleyin.
  5. main() fonksiyonunu çağırın. {, main() işlevinin gövdesinin başlangıcını işaret eder.
  6. Anahtarları dizeler ve değerler tamsayıları olacak olan my_map adında bir harita oluşturun.
  7. Değerleri my_map haritasına ekleyin. Haritaya Cow anahtarı ve 1 değeri eklenecektir.
  8. Değerleri my_map haritasına ekleyin. Haritaya Cat anahtarı ve 2 değeri eklenecektir.
  9. Bir aslanın anahtarıyla my_map haritasına 3 değerini ekleyin.
  10. Anahtar kediyi bulmak için my_map haritası üzerinde yineleme yapmak üzere bir yineleyici oluşturun.
  11. Yineleyicinin işaret ettiği öğeyi silin.
  12. my_map haritasının elemanları üzerinde baştan sona yineleme yapmak için bir yineleyici kullanın.
  13. My_map haritasının içeriğini konsolda yazdırın.
  14. Programın başarılı bir şekilde tamamlanmasının ardından çıktıyı döndürmesi gerekir.
  15. Main() işlevinin gövdesinin sonu.

SSS

`std::map`, anahtarları kendi kendini dengeleyen ikili arama ağacı kullanarak sıralı tutar ve O(log n) işlem karmaşıklığı sağlar. `std::unordered_map` ise ortalama O(1) arama için bir karma tablo kullanır ancak anahtarları belirli bir sırada saklamaz. Sıralama ihtiyaçlarınıza göre seçim yapın.

`std::map` genellikle kendi kendini dengeleyen bir ikili arama ağacı, çoğunlukla da kırmızı-siyah ağaç olarak uygulanır. Bu, anahtarları sıralı halde tutar ve ekleme, silme ve arama işlemleri için logaritmik zaman garantisi verir.

Hayır. `std::map` yalnızca benzersiz anahtarlar içerir, bu nedenle mevcut bir anahtarı eklemek onu geçersiz kılmaz. Yinelenen anahtarlar gerektiğinde, birden fazla öğenin aynı anahtar değerini paylaşmasına olanak tanıyan `std::multimap` kullanın.

Bir değeri okumak veya atamak için `map_name[key]` kullanın; alt simge operatörü, anahtar eksikse varsayılan bir giriş ekler. `at()` üyesi, eksik anahtarlar için bir istisna fırlatır, bu da onu daha güvenli bir seçenek haline getirir.

Üçüncü şablon bağımsız değişkeni olarak özel bir karşılaştırıcı geçirin, örneğin std::map. Daha büyük karşılaştırıcı, varsayılan artan sıralama yerine anahtarları en yüksekten en düşüğe doğru sıralar.

`std::map` anahtar-değer çiftlerini saklar ve değerleri anahtara göre arar, `std::set` ise yalnızca ilişkili değer içermeyen benzersiz anahtarları saklar. Her ikisi de öğeleri sıralı tutar, ancak `map` her anahtarla veri ilişkilendirir.

Evet. Yapay zekâ kodlama asistanları, kısa bir komut istemini veya yorumu, bildirimler, ekleme çağrıları ve yineleyici döngüleri de dahil olmak üzere çalışan std::map koduna dönüştürür. Derlemeden önce her zaman oluşturulan anahtar türlerini, sıralamayı ve uç durumları gözden geçirin.

Evet. GitHub Yardımcı Pilotu Yazarken harita bildirimleri, ekleme ve bulma çağrıları ve yineleme döngüleri önerir. Tekrarlayan şablon kodlarını iyi bir şekilde ele alır, ancak derlemeden önce anahtar benzersizliğini ve mantığını yine de doğrulamanız gerekir.

Bu yazıyı şu şekilde özetleyin: