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ị 95Cù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ị 0Tí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.
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à
ncặ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:
- Tạo một
std::map<std::string, int>có têninventory - Đọc số lượng sản phẩm ban đầu
- 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
- In hàng tồn kho ban đầu theo định dạng bên dưới
- Đọc tên sản phẩm và số lượng mới cần cập nhật
- 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
- 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;
}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
1Con trỏ và bộ nhớ
Con trỏ là gì?Toán tử lấy địa chỉToán tử giải tham chiếuCon trỏ nullCon trỏ và mảngBộ nhớ động với newGiải phóng bộ nhớ với deleteÔn tập: luyện tập về con trỏ4Ánh xạ (cặp khóa-giá trị)
Giới thiệu std::mapTạo ánh xạTruy cập và chỉnh sửa giá trịKiểm tra khóaXóa các cặpDuyệt qua ánh xạÔn tập: tần suất từ2Vector (mảng động)
Giới thiệu std::vectorTạo vectorThêm phần tửTruy cập phần tửKích thước vectorDuyệt bằng vòng lặp forVòng lặp for dựa trên phạm viXóa phần tửÔn tập: các thao tác với vector5Dự án: Công cụ quản lý hàng tồn kho
Thiết lập dự ánThêm và cập nhật mặt hàng3Dự án: Công cụ danh sách công việc
Tổng quan dự ánThêm công việc6Tập hợp (các phần tử duy nhất)
Giới thiệu std::setTạo tập hợp và thêm phần tửKiểm tra phần tửXóa phần tửDuyệt qua tập hợpÔn tập: các số duy nhấtTự luyện tập: Trình biên dịch C++ online