2014-05-23 17 views
8

Theo http://www.cplusplus.com/reference/map/map/, tôi có thể sử dụng m[k] hoặc m.at(k) để truy cập giá trị của khóa k trong bản đồ m. Tuy nhiên, khi tôi cố gắng làmstd :: toán tử truy cập bản đồ không được chấp nhận? không có toán tử [] khớp với các toán hạng này

derivMap[fx] 

trong mã của tôi, nơi derivMap là một yếu tố của loại std::map<std::string,std::string> Visual Studio 2013 mang lại cho tôi những cảnh báo

không operator [] phù hợp với các toán hạng

Tuy nhiên, khi tôi thay đổi mã của mình thành

derivMap.at(fx) 

Tôi không gặp lỗi. Bạn có hiểu biết gì về vấn đề này không?

Trả lời

37

map::operator[] không được dùng nữa.

Tôi đoán rằng bạn đang cố gọi nhà điều hành trong ngữ cảnh nơi derivMapconst. map::operator[] không có quá tải const vì nó có thể sửa đổi bản đồ bằng cách chèn phần tử khi không khớp với một phần tử. Mặt khác, map::at() có quá tải const vì nó được thiết kế để ném khi không tìm thấy phần tử.

void foo(std::map<int, int>& m) 
{ 
    int n = m[42]; // OK 
} 

void bar(const std::map<int, int>& m) 
{ 
    int n = m[42]; // ERROR 
} 
+1

Tôi thích '.find' thành' .at'. Tôi không bao giờ sử dụng '.at'. –

+0

@MooingDuck Tôi đoán nó phụ thuộc vào việc sự vắng mặt của một phần tử là một lỗi hay không (và cho dù bạn có C++ 11.) – juanchopanza

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