Chuyển tới nội dung chính

std::map::at

#include <map>

      mapped_type& at(const key_type& key);
const mapped_type& at(const key_type& key) const;

Truy cập phần tử có key cho trước. Nó tương tự như toán tử [], nhưng at() kiểm tra xem key có tồn tại trong std::map hay không và ném ra ngoại lệ std::out_of_range nếu key không tồn tại.

Tham số

key

  • Giá trị của key cần truy cập.

Giá trị trả về

mapped_type&

  • (phiên bản không const): Trả về tham chiếu (có thể đọc và ghi) đến value của phần tử có key bằng key.

const mapped_type&

  • (phiên bản const): Trả về tham chiếu hằng (chỉ đọc) đến value của phần tử có key bằng key. Phiên bản này được sử dụng khi std::map là một đối tượng const.

Đặc điểm

  1. Truy cập theo key: at() cho phép bạn truy cập trực tiếp value của phần tử thông qua key.
  2. Tham chiếu: at() trả về tham chiếu, cho phép bạn thay đổi trực tiếp giá trị của phần tử (trừ phiên bản const).
  3. Hai phiên bản: Phiên bản const được sử dụng cho các đối tượng std::map const, đảm bảo tính an toàn về const.
  4. Ném ngoại lệ khi key không tồn tại: Đây là điểm khác biệt chính giữa at()operator[]. Nếu key không tồn tại trong std::map, at() sẽ ném ra ngoại lệ std::out_of_range.
  5. Không thay đổi std::map (khi key tồn tại): Khi key đã tồn tại, việc gọi at() sẽ không thay đổi cấu trúc hay kích thước của std::map (ngoại trừ việc thay đổi value thông qua tham chiếu trả về ở phiên bản non-const).
  6. Phân biệt với operator[]: operator[] sẽ chèn thêm 1 phần tử có key-value (với value mặc định) nếu key chưa tồn tại, at() thì không làm thay đổi std::map và ném ra ngoại lệ out_of_range.
  7. Độ phức tạp: O(log n) - thời gian logarit, với n là số phần tử trong std::map.

Ví dụ

#include <iostream>
#include <map>
#include <string>

int main() {
std::map<std::string, int> mymap = {
{"apple", 1},
{"banana", 2},
{"orange", 3}
};

// Truy cập và in ra value của phần tử có key "banana"
std::cout << "Value of banana: " << mymap.at("banana") << '\n'; // Output: Value of banana: 2

// Thay đổi value của phần tử có key "apple"
mymap.at("apple") = 10;

// Truy cập phần tử có key "grape" (không tồn tại)
try {
std::cout << mymap.at("grape") << '\n';
} catch (const std::out_of_range& oor) {
std::cerr << "Out of Range error: " << oor.what() << '\n'; // Output: Out of Range error: map::at: key not found
}

return 0;
}

Các hàm liên quan

[]Truy cập phần tử có key tương ứng trong std::map
findTìm kiếm một phần tử có key bằng với giá trị key cho trước trong std::map