Odczytywanie i modyfikowanie wartości
Część sekcji Logika i przepływ programu ścieżki C++ w Coddy. Lekcja 25 z 56.
Gdy masz już mapę z parami klucz–wartość, często trzeba będzie pobierać lub aktualizować zapisane w niej wartości. Operator nawiasów kwadratowych [] to wygodny sposób zarówno na dostęp do istniejących wartości, jak i ich modyfikowanie.
Aby uzyskać dostęp do wartości, po prostu użyj klucza w nawiasach kwadratowych:
std::map<std::string, int> scores;
scores["Alice"] = 95;
int aliceScore = scores["Alice"]; // Pobiera 95Ta sama składnia działa przy aktualizowaniu istniejących wartości:
scores["Alice"] = 98; // Aktualizuje wynik Alice do 98Oto ważne zachowanie, o którym warto pamiętać: jeśli użyjesz operatora [] z kluczem, który nie istnieje w mapie, automatycznie utworzy on nowy element z tym kluczem i zainicjuje go wartością domyślną (0 dla liczb całkowitych, pustym ciągiem znaków dla ciągów znaków itd.).
int bobScore = scores["Bob"]; // Tworzy "Bob" z wartością 0Ta funkcja automatycznego tworzenia sprawia, że operator [] jest bardzo wygodny zarówno do odczytywania, jak i zapisywania danych mapy, ponieważ nie musisz sprawdzać, czy klucz istnieje, zanim go użyjesz.
Możesz również iterować przez wszystkie pary klucz-wartość w mapie za pomocą pętli for opartej na zakresie. Każdy element w mapie jest parą, w której pair.first przechowuje klucz, a pair.second przechowuje wartość:
for (auto pair : scores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}Spowoduje to wypisanie każdej pary klucz-wartość przechowywanej w mapie, po jednej w każdym wierszu.
Wyzwanie
ŁatwyUtwórz program zarządzający systemem magazynowym produktów za pomocą std::map. Program będzie śledzić nazwy produktów i aktualne ilości ich zapasów, umożliwiając dostęp do poziomów zapasów i ich aktualizowanie.
Dane wejściowe będą podane w następującej postaci:
- Liczba całkowita
noznaczająca liczbę początkowych produktów - Następnie
npar danych wejściowych:- Ciąg znaków reprezentujący nazwę produktu
- Liczba całkowita reprezentująca początkową ilość produktu w magazynie
- Ciąg znaków reprezentujący nazwę produktu do zaktualizowania
- Liczba całkowita reprezentująca nową ilość tego produktu w magazynie
Program powinien:
- Utworzyć obiekt
std::map<std::string, int>o nazwieinventory - Wczytać liczbę początkowych produktów
- Dla każdego produktu wczytać nazwę i ilość w magazynie, a następnie dodać je do mapy za pomocą notacji nawiasów kwadratowych
- Wypisać początkowy stan magazynu w formacie pokazanym poniżej
- Wczytać nazwę produktu i nową ilość do aktualizacji
- Użyć operatora nawiasów kwadratowych, aby zaktualizować ilość wskazanego produktu w magazynie
- Wypisać zaktualizowany stan magazynu, pokazując zmienioną ilość produktu
Użyj dokładnie następującego formatu wyjściowego:
Initial Inventory:
[product1]: [quantity1]
[product2]: [quantity2]
[product3]: [quantity3]
...
Updated Inventory:
[product1]: [quantity1]
[product2]: [updated_quantity2]
[product3]: [quantity3]
...Produkty powinny być wypisywane w kolejności, w jakiej pojawiają się podczas iterowania po mapie (alfabetycznie według nazwy produktu). Użyj pętli for opartej na zakresie, aby dwukrotnie przejść przez mapę, uzyskując dostęp do każdej pary klucz-wartość za pomocą pair.first dla nazwy produktu i pair.second dla ilości. Jeśli nazwa produktu do zaktualizowania nie istnieje w mapie, operator nawiasów kwadratowych automatycznie utworzy nowy wpis o tej nazwie i określonej ilości.
Spróbuj swoich sił
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
// Wczytaj liczbę początkowych produktów
int n;
cin >> n;
// Utwórz mapę stanu magazynowego
map<string, int> inventory;
// Wczytaj początkowe produkty i ich ilości
for (int i = 0; i < n; i++) {
string product;
int quantity;
cin >> product >> quantity;
// TODO: Dodaj produkt do mapy stanu magazynowego
}
// TODO: Wyświetl początkowy stan magazynowy
// Wczytaj produkt do aktualizacji oraz nową ilość
string updateProduct;
int newQuantity;
cin >> updateProduct >> newQuantity;
// TODO: Zaktualizuj ilość produktu w mapie
// TODO: Wyświetl zaktualizowany stan magazynowy
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