2012-05-24 33 views
10

Tôi đã viết đoạn mã sau và đã rất ngạc nhiên về đầu ra. Tôi nghe nói rằng <map> tránh va chạm của các phím, nhưng ở đây nó xuất hiện để cho phép chèn cặp trùng lặp.STL <map> cho phép các cặp trùng lặp?

#include<iostream> 
#include<map> 

using namespace std; 

int main() 
{ 
    map<string,char> namemap; 
    namemap["yogi"]='c'; 

    namemap.insert(pair<string,char>("yogendra",'a')); 
    namemap.insert(pair<string,char>("yogendra",'b')); 

    cout<<namemap["yogendra"]<<endl; 

    return 0; 
} 

Mã này xuất ra a. Bạn có thể chạy nó trên C++ Shell.

Tránh va chạm có nghĩa là chúng tôi không thể nhập nhiều cặp với cùng một khóa không?

+2

Bạn mong đợi hành vi nào? Một ngoại lệ? Ghi đè giá trị đầu tiên với giá trị thứ hai? Bỏ qua giá trị thứ hai? Lỗi trình biên dịch? –

+1

Nó được giải thích rõ ràng [ở đây] (http://en.cppreference.com/w/cpp/container/map/insert) – juanchopanza

+0

@juanchopanza: đôi khi tôi muốn RTFM được xem là một câu trả lời đầy đủ: x –

Trả lời

31

Số thứ hai insert với cùng một khóa là một no-op. Nó đơn giản trả về một trình vòng lặp trỏ đến phần tử hiện có.

std::map::insert() có giá trị trả về, bạn nên kiểm tra.

Nó thuộc loại std::pair<iterator,bool>. Phần tử thứ hai của cặp cho bạn biết phần tử đã được chèn hay chưa hoặc đã có một mục nhập hiện có với cùng một khóa hay chưa.

cout << namemap.insert(pair<string,char>("yogendra",'a')).second << endl; 
cout << namemap.insert(pair<string,char>("yogendra",'b')).second << endl; 
+0

thanks :) giải pháp rõ ràng nghi ngờ và tôi tìm thấy giải pháp :) –

4

Bản đồ sơ đồ không cho phép sử dụng cùng một Phím. Bạn có thể muốn đi cho nhiều bản đồ cho điều đó. !

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