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

std::unordered_map::at

#include <unordered_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::unordered_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&

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

const mapped_type&

  • 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::unordered_map là một đối tượng const (phiên bản 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::unordered_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::unordered_map, at() sẽ ném ra ngoại lệ std::out_of_range.
  5. Không thay đổi std::unordered_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, kích thước hay các phần tử khác của std::unordered_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::unordered_map và ném ra ngoại lệ out_of_range.
  7. Độ phức tạp: Độ phức tạp trung bình của at()O(1) (thời gian hằng số). Trong trường hợp xấu nhất (xung đột hash nhiều), độ phức tạp có thể lên tới O(n), với n là số phần tử trong std::unordered_map.

Ví dụ

#include <iostream>
#include <unordered_map>
#include <string>

int main() {
std::unordered_map<std::string, int> myumap = {
{"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: " << myumap.at("banana") << '\n'; // Output: Value of banana: 2

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

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

return 0;
}

Các hàm liên quan

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