Menu
Coddy logo textTech

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ır

Aynı söz dizimi mevcut değerleri güncellemek için de çalışır:

scores["Alice"] = 98; // Alice'in puanını 98 olarak günceller

Hatı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şturur

Bu 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.

challenge icon

Görev

Kolay

Bir 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:

  1. inventory adında bir std::map<std::string, int> oluşturun
  2. Başlangıçtaki ürün sayısını okuyun
  3. Her ürün için adı ve stok miktarını okuyun, ardından köşeli parantez notasyonunu kullanarak bunları map'e ekleyin
  4. Başlangıç envanterini aşağıda gösterilen formatta yazdırın
  5. Güncellenecek ürün adını ve yeni miktarı okuyun
  6. Belirtilen ürünün stok miktarını güncellemek için köşeli parantez operatörünü kullanın
  7. 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üncelle

Eğ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şturur

Tü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;
}
quiz iconKendini test et

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