2010-10-22 29 views
12

Tôi đã chuyển mã của tôi qua từ std :: map thành std :: unordered_map nếu thích hợp. Với std :: map, tôi thường viết những điều sau đây chỉ để đảm bảo rằng không thể sửa đổi khóa:Sử dụng khóa const cho unordered_map

std::map<const std::string, int> 

Thành thật mà nói, tôi chưa bao giờ kiểm tra xem liệu giá trị này có giá trị hay không. Điều này luôn luôn biên dịch và làm việc với g ++.

Bây giờ, với std :: unordered_map, sau đây không liên kết với g ++ 4.5.1.

std::unordered_map<const std::string, std::string> m; 
m["foo"] = "bar"; 

với điều này lỗi liên kết:

Undefined symbols: "std::hash<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const>::operator()(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const" , referenced from:

Việc sửa chữa rất đơn giản, để loại bỏ const, nhưng bên cạnh đó, là có ngay cả một điểm trong STL với bất kỳ lớp container kết hợp sử dụng một const loại chính? Không có phương pháp nào cho phép bạn tham chiếu đến khóa cho bất kỳ loại liên kết nào không?

Trả lời

17

Vùng chứa liên kết chỉ hiển thị cặp (khóa, giá trị) là std::pair<const key_type, mapped_type>, do đó, const bổ sung trên loại khóa là thừa.

+5

Hoặc nói cách khác: 'std :: unordered_map ' sẽ làm những gì anh ta muốn. (Jonathan nói, nghỉ ngơi rõ ràng nhất.) –

+0

Heh, vâng, tôi có thể thấy câu trả lời của tôi đòi hỏi phải nhìn vào câu hỏi ban đầu để hiểu nó :) – MSN

Các vấn đề liên quan