2009-03-26 40 views
14

Có lý do gì để chuyển tham chiếu tới bản đồ STL làm const khiến toán tử [] bị ngắt? Tôi nhận được lỗi biên dịch này (gcc 4.2) khi tôi sử dụng const:C++ const std :: tham chiếu bản đồ không biên dịch

error: no match for ‘operator[]’ in ‘map[name]’

Đây là chức năng nguyên mẫu:

void func(const char ch, std::string &str, const std::map<std::string, std::string> &map); 

Và, tôi nên đề cập đến rằng không có vấn đề khi tôi loại bỏ các const từ khóa ở phía trước std :: map.

Nếu tôi được hướng dẫn chính xác, toán tử [] sẽ thực sự chèn một cặp mới vào bản đồ nếu nó không tìm thấy khóa, tất nhiên sẽ giải thích tại sao điều này xảy ra, nhưng tôi không thể tưởng tượng điều này sẽ là hành vi chấp nhận được.

Nếu có phương pháp tốt hơn, như sử dụng hãy tìm thay vì [], tôi rất cảm kích. Tôi dường như không thể tìm được công việc mặc dù ... Tôi nhận được const lỗi lặp không khớp.

Cảm ơn.

Trả lời

26

Có, bạn không thể sử dụng operator[]. Sử dụng find, nhưng lưu ý nó sẽ trả về const_iterator thay vì iterator:

std::map<std::string, std::string>::const_iterator it; 
it = map.find(name); 
if(it != map.end()) { 
    std::string const& data = it->second; 
    // ... 
} 

Nó giống như với con trỏ. Bạn không thể chỉ định int const* cho int*. Tương tự, bạn không thể chỉ định const_iterator đến iterator.

6

Khi bạn đang sử dụng toán tử [], std :: map tìm kiếm mục có khóa đã cho. Nếu nó không tìm thấy bất kỳ, nó tạo ra nó. Do đó vấn đề với const.

Sử dụng phương thức tìm và bạn sẽ ổn.

Bạn có thể vui lòng đăng mã về cách bạn đang cố gắng sử dụng find() không? Đúng cách sẽ là:

if(map.find(name) != map.end()) 
{ 
    //... 
} 
2

Có thể vì không có toán tử const [] trong std :: map. toán tử [] sẽ thêm phần tử bạn đang tìm kiếm nếu nó không tìm thấy nó. Do đó, sử dụng phương thức find() nếu bạn muốn tìm kiếm mà không có khả năng thêm vào.

2

Đối với "lỗi const iterator không hạnh phúc" của bạn:

find() có hai quá tải:

 iterator find (const key_type& x); 
const_iterator find (const key_type& x) const; 

My đoán là bạn đang nhận được lỗi này vì bạn đang làm một cái gì đó như gán một iterator không const (bên trái) để kết quả của một cuộc gọi find() trên bản đồ const:

iterator<...> myIter /* non-const */ = myConstMap.find(...) 

Điều đó sẽ dẫn đến lỗi, mặc dù có lẽ không phải lỗi bạn đang xem.

3

Nếu bạn đang sử dụng C++ 11, std::map::at sẽ phù hợp với bạn.

Lý do std::map::operator[] không hoạt động là trong trường hợp khóa bạn đang tìm kiếm không tồn tại trong bản đồ, nó sẽ chèn phần tử mới bằng cách sử dụng khóa được cung cấp và trả về tham chiếu đến nó (xem liên kết để biết chi tiết). Điều này là không thể trên một const std :: map.

Phương thức 'at', tuy nhiên, sẽ ném một ngoại lệ nếu khóa không tồn tại. Điều đó đang được nói, nó có lẽ là một ý tưởng tốt để kiểm tra sự tồn tại của khóa bằng cách sử dụng phương thức std :: map :: find trước khi cố truy cập phần tử bằng cách sử dụng phương thức 'at'.

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