Usuwanie par
Część sekcji Logika i przepływ programu ścieżki C++ w Coddy. Lekcja 27 z 56.
Czasami trzeba usunąć pary klucz-wartość z mapy, gdy nie są już potrzebne. Metoda .erase() umożliwia łatwe usuwanie elementów przez podanie klucza, który chcesz usunąć.
Aby usunąć element z mapy, po prostu wywołaj .erase(), przekazując klucz jako argument:
std::map<std::string, int> scores;
scores["Alice"] = 95;
scores["Bob"] = 87;
scores["Carol"] = 92;
scores.erase("Bob"); // Całkowicie usuwa wpis dla BobPo wywołaniu erase("Bob") mapa będzie zawierać tylko wyniki Alice i Carol. Jeśli spróbujesz usunąć klucz, który nie istnieje w mapie, operacja po prostu nic nie zrobi — nie wystąpi żaden błąd.
Podczas iterowania po mapie za pomocą pętli for opartej na zakresie każdy element jest obiektem std::pair zawierającym klucz i wartość. Możesz uzyskać dostęp do klucza za pomocą .first, a do wartości za pomocą .second:
for (auto pair : scores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}Wypisze każdą nazwę i każdy wynik w kolejności alfabetycznej, ponieważ std::map automatycznie sortuje swoje klucze.
Ta metoda jest szczególnie przydatna do utrzymywania porządku w strukturach danych, usuwania nieaktualnych informacji lub implementowania funkcji umożliwiających użytkownikom usuwanie wpisów z aplikacji.
Wyzwanie
ŁatwyUtwórz program, który zarządza katalogiem kontaktów za pomocą std::map. Program będzie przechowywać imiona i nazwiska kontaktów oraz numery telefonów, a następnie umożliwi użytkownikom usuwanie wybranych kontaktów z katalogu za pomocą metody .erase().
Podane zostaną następujące dane wejściowe:
- Liczba całkowita
noznaczająca liczbę początkowych kontaktów - Następnie
npar danych wejściowych:- Ciąg znaków reprezentujący nazwę kontaktu
- Ciąg znaków reprezentujący numer telefonu
- Liczba całkowita
moznaczająca liczbę kontaktów do usunięcia - Następnie
mciągów znaków reprezentujących nazwy kontaktów do usunięcia
Twój program powinien:
- Utworzyć obiekt
std::map<std::string, std::string>o nazwiecontacts - Wczytać liczbę początkowych kontaktów i wypełnić mapę nazwami kontaktów oraz numerami telefonów
- Wypisać początkowy katalog kontaktów w formacie pokazanym poniżej
- Wczytać liczbę kontaktów do usunięcia
- Dla każdej nazwy kontaktu do usunięcia użyć metody
.erase(), aby usunąć ten kontakt z mapy - Wypisać zaktualizowany katalog kontaktów po usunięciu wszystkich wskazanych kontaktów
Użyj dokładnie następującego formatu wyjściowego:
Początkowy katalog:
Initial Contact Directory:
[contact1]: [phone1]
[contact2]: [phone2]
[contact3]: [phone3]
...Zaktualizowany katalog po usunięciu kontaktów:
Updated Contact Directory:
[remaining_contact1]: [phone1]
[remaining_contact2]: [phone2]
...Jeśli katalog będzie pusty po usunięciu wszystkich wskazanych kontaktów, wypisz:
Updated Contact Directory:
Directory is emptyKontakty należy wypisać w kolejności, w jakiej pojawiają się podczas iterowania po mapie (alfabetycznie według nazwy kontaktu). Użyj pętli for opartej na zakresie, aby dwukrotnie iterować po mapie, uzyskując dostęp do każdej pary klucz-wartość za pomocą pair.first dla nazwy kontaktu i pair.second dla numeru telefonu. Pamiętaj, że próba usunięcia nieistniejącego kontaktu nie spowoduje błędu — mapa po prostu pozostanie bez zmian.
Spróbuj swoich sił
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
// Wczytaj liczbę początkowych kontaktów
int n;
cin >> n;
// Utwórz mapę kontaktów
map<string, string> contacts;
// Wczytaj początkowe kontakty
for (int i = 0; i < n; i++) {
string name, phone;
cin >> name >> phone;
// TODO: Dodaj kontakt do mapy
}
// Wyświetl początkową książkę telefoniczną
cout << "Initial Contact Directory:" << endl;
// TODO: Wyświetl wszystkie kontakty, używając pętli for opartej na zakresie
// Wczytaj liczbę kontaktów do usunięcia
int m;
cin >> m;
// Usuń kontakty
for (int i = 0; i < m; i++) {
string nameToRemove;
cin >> nameToRemove;
// TODO: Usuń kontakt za pomocą metody .erase()
}
// Wyświetl zaktualizowaną książkę telefoniczną
cout << "Updated Contact Directory:" << endl;
// TODO: Wyświetl pozostałe kontakty lub "Directory is empty", jeśli lista jest pusta
return 0;
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ programu
1Wskaźniki i pamięć
Czym jest wskaźnik?Operator pobrania adresuOperator dereferencjiWskaźniki zeroweWskaźniki i tabliceDynamiczne zarządzanie pamięcią za pomocą „new”Zwalnianie pamięci za pomocą „delete”Podsumowanie — ćwiczenia ze wskaźnikami4Mapy (pary klucz–wartość)
Poznajemy std::mapTworzenie mapyOdczytywanie i modyfikowanie wartościSprawdzanie kluczyUsuwanie parIterowanie po mapiePodsumowanie – częstość występowania słów2Wektory (tablice dynamiczne)
Wprowadzenie do std::vectorTworzenie wektoraDodawanie elementówDostęp do elementówRozmiar wektoraIterowanie za pomocą pętli forPętla for oparta na zakresieUsuwanie elementówPodsumowanie — operacje na wektorach5Projekt: Narzędzie do zarządzania zapasami
Konfiguracja projektuDodawanie i aktualizowanie produktów3Projekt: narzędzie do listy zadań
Przegląd projektuDodawanie zadaniaPoćwicz samodzielnie: Kompilator C++ online