Trong lập trình C++, thư viện std::map
là một trong những cấu trúc dữ liệu được sử dụng phổ biến để lưu trữ các cặp key-value (khoá-giá trị). Để truy cập giá trị liên kết với một khoá cụ thể, thư viện này cung cấp nhiều phương thức, và một trong số đó là std::map::at()
. Phương thức này giúp truy cập an toàn phần tử trong map và là một công cụ hữu ích cho các lập trình viên.
std::map::at()
hoạt động bằng cách nhận vào khoá bạn muốn truy cập và trả về giá trị tương ứng với khoá đó. Nếu khoá không tồn tại trong map, nó sẽ ném một ngoại lệ std::out_of_range
, thay vì tra về một giá trị mặc định hoặc thêm khoá mới vào map như một số phương thức khác.
Cách sử dụng std::map::at()
Dưới đây là ví dụ đơn giản về cách sử dụng std::map::at()
:
#include <iostream>
#include <map>
#include <stdexcept>
int main() {
// Tạo một map đơn giản
std::map<int, std::string> mymap;
// Thêm các phần tử vào map
mymap[1] = "One";
mymap[2] = "Two";
mymap[3] = "Three";
try {
// Truy cập phần tử với khoá 2
std::cout << "Key 2: " << mymap.at(2) << std::endl;
// Truy cập phần tử với khoá 4
// Lưu ý: Khoá 4 không tồn tại trong map này
std::cout << "Key 4: " << mymap.at(4) << std::endl;
} catch (const std::out_of_range& e) {
std::cerr << "Lỗi: " << e.what() << "\n";
}
return 0;
}
So sánh operator[]
và std::map::at()
Một phương thức phổ biến khác để truy cập các giá trị trong std::map
là sử dụng toán tử operator[]
. Tuy nhiên, có một vài sự khác biệt quan trọng giữa hai phương thức này:
-
std::map::at()
: Khi khoá không tồn tại trong map, nó sẽ ném một ngoại lệstd::out_of_range
. Điều này giúp bạn dễ dàng phát hiện ra những lỗi khi truy cập các khoá không hợp lệ. -
operator[]
: Khi khoá không tồn tại trong map, một cặp key-value mới sẽ được thêm vào map với giá trị mặc định của loại value. Điều này có thể gây ra những hành vi không mong muốn nếu bạn chỉ muốn đọc giá trị mà không có ý định thay đổi map.
Ví dụ dưới đây minh hoạ sự khác biệt này:
#include <iostream>
#include <map>
int main() {
std::map<int, std::string> mymap;
mymap[1] = "One";
mymap[2] = "Two";
mymap[3] = "Three";
// Sử dụng toán tử []
std::string value = mymap[4]; // Tạo một cặp khoá-giá trị {4, ""}
std::cout << "Value for key 4: '" << value << "'\n";
std::cout << "Size of map: " << mymap.size() << "\n"; // Kích thước của map bây giờ là 4
return 0;
}
Trong ví dụ này, bạn có thể thấy rằng sau khi truy cập khoá 4 không tồn tại bằng operator[]
, kích thước của map tăng lên, và một partner mới được thêm vào.
Kết luận
Sử dụng std::map::at()
là một cách an toàn và hiệu quả để truy cập các giá trị trong C++ std::map
. Khả năng ném ngoại lệ khi khoá không tồn tại là một lợi thế giúp tránh được nhiều lỗi ngẫu nhiên trong quá trình lập trình. Tuy nhiên, bạn cần lưu ý xử lý ngoại lệ này đúng cách để chương trình không bị dừng đột ngột.
Comments