Menu
CoddyTech

Truy cập và chỉnh sửa giá trị

Thuộc phần Logic và luồng chương trình trong hành trình C++ của Coddy. Bài học 25 trên 56.

Khi đã có một map gồm các cặp khóa và giá trị, bạn thường cần lấy hoặc cập nhật các giá trị được lưu trong đó. Toán tử ngoặc vuông [] giúp bạn dễ dàng truy cập các giá trị hiện có và sửa đổi chúng.

Để truy cập một giá trị, bạn chỉ cần dùng khóa (key) bên trong dấu ngoặc vuông:

std::map<std::string, int> scores;
scores["Alice"] = 95;
int aliceScore = scores["Alice"]; // Lấy giá trị 95

Cùng cú pháp đó cũng dùng để cập nhật các giá trị hiện có:

scores["Alice"] = 98; // Cập nhật điểm của Alice thành 98

Đây là một hành vi quan trọng cần nhớ: nếu bạn dùng toán tử [] với một khóa không tồn tại trong map, toán tử này sẽ tự động tạo một phần tử mới với khóa đó và khởi tạo phần tử bằng giá trị mặc định (0 đối với số nguyên, chuỗi rỗng đối với chuỗi, v.v.).

int bobScore = scores["Bob"]; // Tạo "Bob" với giá trị 0

Tính năng tự động tạo này giúp toán tử [] rất tiện lợi khi đọc và ghi dữ liệu bản đồ, vì bạn không cần kiểm tra xem khóa đã tồn tại hay chưa trước khi sử dụng.

Bạn cũng có thể duyệt qua tất cả các cặp khóa-giá trị trong map bằng vòng lặp for dựa trên phạm vi. Mỗi phần tử trong map là một cặp, trong đó pair.first chứa khóa và pair.second chứa giá trị:

for (auto pair : scores) {
    std::cout << pair.first << ": " << pair.second << std::endl;
}

Lệnh này sẽ in ra từng cặp khóa-giá trị được lưu trong map, mỗi cặp trên một dòng.

challenge icon

Thử thách

Dễ

Hãy tạo một chương trình quản lý hệ thống hàng tồn kho bằng std::map. Chương trình sẽ theo dõi tên sản phẩm và số lượng hàng tồn kho hiện tại, cho phép bạn truy cập và cập nhật mức tồn kho.

Chương trình sẽ nhận các đầu vào sau:

  • Một số nguyên n đại diện cho số lượng sản phẩm ban đầu
  • Sau đó là n cặp đầu vào:
    • Một chuỗi đại diện cho tên sản phẩm
    • Một số nguyên đại diện cho số lượng hàng tồn kho ban đầu
  • Một chuỗi đại diện cho tên sản phẩm cần cập nhật
  • Một số nguyên đại diện cho số lượng hàng tồn kho mới của sản phẩm đó

Chương trình cần:

  1. Tạo một std::map<std::string, int> có tên inventory
  2. Đọc số lượng sản phẩm ban đầu
  3. Với mỗi sản phẩm, đọc tên và số lượng hàng tồn kho, sau đó thêm chúng vào map bằng ký hiệu ngoặc vuông
  4. In hàng tồn kho ban đầu theo định dạng bên dưới
  5. Đọc tên sản phẩm và số lượng mới cần cập nhật
  6. Dùng toán tử ngoặc vuông để cập nhật số lượng hàng tồn kho của sản phẩm được chỉ định
  7. In hàng tồn kho đã cập nhật, thể hiện mức tồn kho đã thay đổi

Dùng chính xác định dạng đầu ra sau:

Initial Inventory:
[product1]: [quantity1]
[product2]: [quantity2]
[product3]: [quantity3]
...
Updated Inventory:
[product1]: [quantity1]
[product2]: [updated_quantity2]
[product3]: [quantity3]
...

Các sản phẩm cần được in theo thứ tự khi duyệt qua map, tức là theo thứ tự bảng chữ cái của tên sản phẩm. Dùng vòng lặp for dựa trên phạm vi để duyệt qua map cả hai lần, truy cập từng cặp khóa và giá trị bằng pair.first cho tên sản phẩm và pair.second cho số lượng. Nếu tên sản phẩm cần cập nhật chưa có trong map, toán tử ngoặc vuông sẽ tự động tạo một mục mới với tên đó và số lượng đã chỉ định.

Tự làm thử

#include <iostream>
#include <map>
#include <string>
using namespace std;

int main() {
    // Đọc số lượng sản phẩm ban đầu
    int n;
    cin >> n;
    
    // Tạo map lưu hàng tồn kho
    map<string, int> inventory;
    
    // Đọc các sản phẩm ban đầu và số lượng tương ứng
    for (int i = 0; i < n; i++) {
        string product;
        int quantity;
        cin >> product >> quantity;
        // TODO: Thêm sản phẩm vào map lưu hàng tồn kho
    }
    
    // TODO: In ra danh sách hàng tồn kho ban đầu
    
    // Đọc sản phẩm cần cập nhật và số lượng mới
    string updateProduct;
    int newQuantity;
    cin >> updateProduct >> newQuantity;
    
    // TODO: Cập nhật số lượng sản phẩm trong map
    
    // TODO: In ra danh sách hàng tồn kho sau khi cập nhật
    
    return 0;
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng chương trình

Tự luyện tập: Trình biên dịch C++ online