Değerlere Erişme ve Değiştirme
Coddy'nin C++ Journey'sinin Mantık & Akış bölümünün bir parçası — ders 25 / 56.
Anahtar-değer çiftlerine sahip bir haritanız (map) olduğunda, genellikle içinde saklanan değerleri almanız veya güncellemeniz gerekecektir. Köşeli parantez [] operatörü, hem mevcut değerlere erişmek hem de onları değiştirmek için kullanışlı bir yol sağlar.
Bir değere erişmek için anahtarı köşeli parantez içinde kullanmanız yeterlidir:
std::map<std::string, int> scores;
scores["Alice"] = 95;
int aliceScore = scores["Alice"]; // 95 değerini alırAynı söz dizimi mevcut değerleri güncellemek için de çalışır:
scores["Alice"] = 98; // Alice'in puanını 98 olarak güncellerHatırlanması gereken önemli bir davranış şudur: Eğer map içerisinde mevcut olmayan bir anahtar ile [] operatörünü kullanırsanız, bu operatör otomatik olarak o anahtara sahip yeni bir öğe oluşturur ve onu varsayılan bir değerle (tam sayılar için 0, stringler için boş string vb.) başlatır.
int bobScore = scores["Bob"]; // 0 değeri ile "Bob" oluştururBu otomatik oluşturma özelliği, bir anahtarın var olup olmadığını kullanmadan önce kontrol etmenize gerek kalmadığı için [] operatörünü hem harita verilerini okumak hem de yazmak için çok kullanışlı hale getirir.
Bir map içindeki tüm anahtar-değer çiftleri üzerinde aralık tabanlı (range-based) bir for döngüsü kullanarak da gezinebilirsiniz. Map içindeki her bir öğe bir pair'dir (çift); burada pair.first anahtarı, pair.second ise değeri tutar:
for (auto pair : scores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}Bu, map içinde saklanan her bir anahtar-değer çiftini her satıra bir tane gelecek şekilde yazdıracaktır.
Görev
KolayBir std::map kullanarak ürün envanter sistemini yöneten bir program oluşturun. Programınız, ürün adlarını ve mevcut stok miktarlarını takip ederek envanter seviyelerine erişmenizi ve bunları güncellemenizi sağlayacaktır.
Aşağıdaki girdiler sağlanacaktır:
- Başlangıçtaki ürün sayısını temsil eden bir tam sayı
n - Ardından
nçift girdi:- Ürün adını temsil eden bir dize (string)
- Başlangıç stok miktarını temsil eden bir tam sayı
- Güncellenecek bir ürün adını temsil eden bir dize
- O ürün için yeni stok miktarını temsil eden bir tam sayı
Programınız şunları yapmalıdır:
inventoryadında birstd::map<std::string, int>oluşturun- Başlangıçtaki ürün sayısını okuyun
- Her ürün için adı ve stok miktarını okuyun, ardından köşeli parantez notasyonunu kullanarak bunları map'e ekleyin
- Başlangıç envanterini aşağıda gösterilen formatta yazdırın
- Güncellenecek ürün adını ve yeni miktarı okuyun
- Belirtilen ürünün stok miktarını güncellemek için köşeli parantez operatörünü kullanın
- Değiştirilen stok seviyesini gösteren güncellenmiş envanteri yazdırın
Aşağıdaki tam çıktı formatını kullanın:
Initial Inventory:
[product1]: [quantity1]
[product2]: [quantity2]
[product3]: [quantity3]
...
Updated Inventory:
[product1]: [quantity1]
[product2]: [updated_quantity2]
[product3]: [quantity3]
...Ürünler, map üzerinde döngü kurulduğunda göründükleri sırada (ürün adına göre alfabetik sıra) yazdırılmalıdır. Her iki seferde de map üzerinde gezinmek için aralık tabanlı (range-based) bir for döngüsü kullanın; ürün adı için pair.first ve miktar için pair.second ile her bir anahtar-değer çiftine erişin. Güncellenecek ürün adı map'te mevcut değilse, köşeli parantez operatörü otomatik olarak o adla ve belirtilen miktarla yeni bir giriş oluşturacaktır.
Kopya kağıdı
Map değerlerine erişmek ve bunları değiştirmek için köşeli parantez [] operatörünü kullanın:
std::map<std::string, int> scores;
scores["Alice"] = 95; // Değer ata
int aliceScore = scores["Alice"]; // Değeri al
scores["Alice"] = 98; // Değeri güncelleEğer [] operatörünü mevcut olmayan bir anahtarla kullanırsanız, otomatik olarak varsayılan değere sahip yeni bir öğe oluşturur:
int bobScore = scores["Bob"]; // 0 değerine sahip "Bob" anahtarını oluştururTüm anahtar-değer çiftleri üzerinde gezinmek için aralık tabanlı (range-based) bir for döngüsü kullanın. Her çift, anahtar için .first ve değer için .second özelliklerine sahiptir:
for (auto pair : scores) {
// pair.first = anahtar (örneğin "Alice")
// pair.second = değer (örneğin 98)
}Kendin dene
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
// Başlangıçtaki ürün sayısını oku
int n;
cin >> n;
// Envanter haritasını oluştur
map<string, int> inventory;
// Başlangıç ürünlerini ve miktarlarını oku
for (int i = 0; i < n; i++) {
string product;
int quantity;
cin >> product >> quantity;
// TODO: Ürünü envanter haritasına ekle
}
// TODO: Başlangıç envanterini yazdır
// Güncellenecek ürünü ve yeni miktarı oku
string updateProduct;
int newQuantity;
cin >> updateProduct >> newQuantity;
// TODO: Haritadaki ürün miktarını güncelle
// TODO: Güncellenmiş envanteri 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