Menu
CoddyTech

Xóa các cặp

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 27 trên 56.

Đôi khi, bạn cần xóa các cặp khóa-giá trị khỏi map khi không còn cần đến chúng. Phương thức .erase() giúp bạn xóa phần tử một cách đơn giản bằng cách chỉ định khóa cần xóa.

Để xóa một phần tử khỏi map, chỉ cần gọi .erase() với khóa làm đối số:

std::map<std::string, int> scores;
scores["Alice"] = 95;
scores["Bob"] = 87;
scores["Carol"] = 92;

scores.erase("Bob"); // Xóa hoàn toàn mục của Bob

Sau khi gọi erase("Bob"), map chỉ còn điểm số của Alice và Carol. Nếu bạn thử xóa một khóa không tồn tại trong map, thao tác này sẽ không làm gì cả, không xảy ra lỗi.

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

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

Câu lệnh này sẽ in ra từng tên và điểm theo thứ tự bảng chữ cái, vì std::map tự động sắp xếp các khóa.

Phương thức này đặc biệt hữu ích khi bạn cần duy trì cấu trúc dữ liệu gọn gàng, xóa thông tin lỗi thời hoặc triển khai tính năng cho phép người dùng xóa mục khỏi ứng dụng.

challenge icon

Thử thách

Dễ

Tạo một chương trình quản lý danh bạ bằng std::map. Chương trình lưu tên và số điện thoại của các liên hệ, sau đó cho phép người dùng xóa các liên hệ cụ thể khỏi danh bạ bằng phương thức .erase().

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

  • Một số nguyên n biểu thị số liên hệ ban đầu
  • Sau đó là n cặp đầu vào:
    • Một chuỗi biểu thị tên liên hệ
    • Một chuỗi biểu thị số điện thoại
  • Một số nguyên m biểu thị số liên hệ cần xóa
  • Sau đó là m chuỗi biểu thị tên các liên hệ cần xóa

Chương trình cần:

  1. Tạo một std::map<std::string, std::string> có tên là contacts
  2. Đọc số liên hệ ban đầu và thêm tên cùng số điện thoại của các liên hệ vào map
  3. In danh bạ ban đầu theo định dạng bên dưới
  4. Đọc số liên hệ cần xóa
  5. Với mỗi tên liên hệ cần xóa, dùng phương thức .erase() để xóa liên hệ đó khỏi map
  6. In danh bạ đã cập nhật sau khi xóa tất cả liên hệ

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

Danh bạ ban đầu:

Initial Contact Directory:
[contact1]: [phone1]
[contact2]: [phone2]
[contact3]: [phone3]
...

Danh bạ đã cập nhật sau khi xóa:

Updated Contact Directory:
[remaining_contact1]: [phone1]
[remaining_contact2]: [phone2]
...

Nếu danh bạ trống sau khi xóa tất cả liên hệ, hãy in:

Updated Contact Directory:
Directory is empty

Các liên hệ 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 liên hệ. 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-giá trị bằng pair.first để lấy tên liên hệ và pair.second để lấy số điện thoại. Hãy nhớ rằng việc thử xóa một liên hệ không tồn tại sẽ không gây lỗi, map chỉ đơn giản là không thay đổi.

Tự làm thử

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

int main() {
    // Đọc số lượng liên hệ ban đầu
    int n;
    cin >> n;
    
    // Tạo map contacts
    map<string, string> contacts;
    
    // Đọc các liên hệ ban đầu
    for (int i = 0; i < n; i++) {
        string name, phone;
        cin >> name >> phone;
        // TODO: Thêm liên hệ vào map
    }
    
    // In ra danh bạ ban đầu
    cout << "Initial Contact Directory:" << endl;
    // TODO: In ra tất cả liên hệ bằng vòng lặp for dựa trên phạm vi
    
    // Đọc số lượng liên hệ cần xóa
    int m;
    cin >> m;
    
    // Xóa các liên hệ
    for (int i = 0; i < m; i++) {
        string nameToRemove;
        cin >> nameToRemove;
        // TODO: Xóa liên hệ bằng phương thức .erase()
    }
    
    // In ra danh bạ đã cập nhật
    cout << "Updated Contact Directory:" << endl;
    // TODO: In ra các liên hệ còn lại hoặc "Directory is empty" nếu danh bạ trống
    
    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