Çiftleri Kaldırma
Coddy'nin C++ Journey'sinin Mantık & Akış bölümünün bir parçası — ders 27 / 56.
Bazen artık ihtiyaç duyulmadığında anahtar-değer çiftlerini map'inizden kaldırmanız gerekir. .erase() yöntemi, kaldırmak istediğiniz anahtarı belirterek öğeleri silmek için basit bir yol sağlar.
Bir map'ten bir öğeyi kaldırmak için, anahtarı argüman olarak vererek .erase() metodunu çağırmanız yeterlidir:
std::map<std::string, int> scores;
scores["Alice"] = 95;
scores["Bob"] = 87;
scores["Carol"] = 92;
scores.erase("Bob"); // Bob'un girişini tamamen kaldırırerase("Bob") çağrıldıktan sonra, map sadece Alice ve Carol'ın puanlarını içerecektir. Eğer map'te bulunmayan bir anahtarı silmeye çalışırsanız, işlem hiçbir şey yapmaz - herhangi bir hata oluşmaz.
Aralık tabanlı (range-based) bir for döngüsü ile bir map üzerinde iterasyon yaparken, her bir öğe anahtar ve değeri içeren bir std::pair nesnesidir. Anahtara .first ile, değere ise .second ile erişebilirsiniz:
for (auto pair : scores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}Bu, her bir ismi ve puanı alfabetik sırayla yazdıracaktır, çünkü std::map anahtarlarını otomatik olarak sıralı tutar.
Bu yöntem; temiz veri yapılarını korumak, güncelliğini yitirmiş bilgileri kaldırmak veya kullanıcıların uygulamanızdan girişleri silebildiği özellikler uygulamak için özellikle yararlıdır.
Görev
KolayBir std::map kullanarak bir kişi dizinini yöneten bir program oluşturun. Programınız kişi adlarını ve telefon numaralarını saklayacak, ardından kullanıcıların .erase() yöntemini kullanarak dizinden belirli kişileri silmesine olanak tanıyacaktır.
Aşağıdaki girdiler sağlanacaktır:
- Başlangıçtaki kişi sayısını temsil eden bir tam sayı
n - Ardından
nçift girdi:- Kişi adını temsil eden bir dize (string)
- Telefon numarasını temsil eden bir dize (string)
- Silinecek kişi sayısını temsil eden bir tam sayı
m - Ardından silinecek kişi adlarını temsil eden
mtane dize (string)
Programınız şunları yapmalıdır:
contactsadında birstd::map<std::string, std::string>oluşturun- Başlangıçtaki kişi sayısını okuyun ve map'i kişi adları ve telefon numaralarıyla doldurun
- Başlangıçtaki kişi dizinini aşağıda gösterilen formatta yazdırın
- Silinecek kişi sayısını okuyun
- Silinecek her kişi adı için, onu map'ten silmek üzere
.erase()yöntemini kullanın - Tüm silme işlemlerinden sonra güncellenmiş kişi dizinini yazdırın
Aşağıdaki tam çıktı formatını kullanın:
Başlangıç dizini:
Initial Contact Directory:
[contact1]: [phone1]
[contact2]: [phone2]
[contact3]: [phone3]
...Silme işlemlerinden sonraki güncellenmiş dizin:
Updated Contact Directory:
[remaining_contact1]: [phone1]
[remaining_contact2]: [phone2]
...Tüm silme işlemlerinden sonra dizin boşalırsa şunu yazdırın:
Updated Contact Directory:
Directory is emptyKişiler, map üzerinde döngü kurulduğunda göründükleri sırada (kişi adına göre alfabetik sıra) yazdırılmalıdır. Map üzerinde her iki seferde de döngü kurmak için aralık tabanlı (range-based) bir for döngüsü kullanın; kişi adı için pair.first ve telefon numarası için pair.second ile her bir anahtar-değer çiftine erişin. Mevcut olmayan bir kişiyi silmeye çalışmanın bir hataya neden olmayacağını, map'in değişmeden kalacağını unutmayın.
Kendin dene
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
// Başlangıç kişi sayısını oku
int n;
cin >> n;
// Kişiler haritasını oluştur
map<string, string> contacts;
// Başlangıç kişilerini oku
for (int i = 0; i < n; i++) {
string name, phone;
cin >> name >> phone;
// YAPILACAK: Kişiyi haritaya ekle
}
// Başlangıç dizinini yazdır
cout << "Initial Contact Directory:" << endl;
// YAPILACAK: Aralık tabanlı for döngüsü kullanarak tüm kişileri yazdır
// Silinecek kişi sayısını oku
int m;
cin >> m;
// Kişileri sil
for (int i = 0; i < m; i++) {
string nameToRemove;
cin >> nameToRemove;
// YAPILACAK: .erase() metodunu kullanarak kişiyi sil
}
// Güncellenmiş dizini yazdır
cout << "Updated Contact Directory:" << endl;
// YAPILACAK: Kalan kişileri yazdır veya boşsa "Directory is empty" yazdır
return 0;
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık & Akış bölümündeki tüm dersler
1İşaretçiler ve Bellek
İşaretçi Nedir?Adres OperatörüDereference OperatörüNull İşaretçilerİşaretçiler ve Diziler'new' ile Dinamik Bellek'delete' ile Belleği Serbest BırakmaÖzet - İşaretçi Pratiği4Map'ler (Anahtar-Değer Çiftleri)
std::map'e GirişBir Map OluşturmaDeğerlere Erişme ve DeğiştirmeAnahtar KontrolüÇiftleri KaldırmaMap Üzerinde YinelemeÖzet - Kelime Frekansı2Vektörler (Dinamik Diziler)
std::vector'a GirişBir Vektör OluşturmaEleman EklemeElemanlara ErişmeVektör BoyutuFor Döngüsü ile YinelemeAralık Tabanlı For DöngüsüEleman SilmeÖzet - Vektör İşlemleri3Proje: Görev Listesi Aracı
Projeye Genel BakışGörev Ekleme