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
- 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. - 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). - Hai phiên bản: Phiên bản
const
được sử dụng cho các đối tượng std::unordered_mapconst
, đảm bảo tính an toàn vềconst
. - 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()
vàoperator[]
. Nếukey
không tồn tại trong std::unordered_map,at()
sẽ ném ra ngoại lệ std::out_of_range. - 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). - Phân biệt với
operator[]
:operator[]
sẽ chèn thêm 1 phần tử cókey-value
(vớivalue
mặc định) nếukey
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. - Độ phức tạp: Độ phức tạp trung bình của
at()
là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ớiO(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 |
find | Tìm kiếm một phần tử có key bằng với giá trị key cho trước trong std::unordered_map |