2012-10-15 36 views
7

Câu hỏi này liên quan trực tiếp đến using char as a key in stdmap.Sử dụng char * làm khóa trong std :: map, nó hoạt động như thế nào

Tôi hiểu chức năng so sánh được truyền vào là gì và tại sao nó được yêu cầu cho các loại char * làm khóa. Tuy nhiên, tôi không chắc chắn như cách cập nhật thực sự hoạt động.

Tôi rất tò mò về trường hợp bạn đang cập nhật khóa. Làm thế nào để std::map biết cách so sánh sự bình đẳng giữa các const char *, cmp_str chỉ cho ánh xạ thứ tự các khóa được chèn vào cây.

Tôi đã thực hiện một chút đào vào mã stl_tree.h (pulled from here) nhưng không thể tìm thấy nhiều. Đoán duy nhất của tôi là nó làm một so sánh bộ nhớ thẳng.

Tôi quan tâm đến cách lớp học ở cấp độ stl_tree xử lý tình huống này hoặc nếu nó không xử lý chính xác mọi lúc, trường hợp nào bị hỏng?

#include <map> 
#include <iostream> 
#include <cstring> 

struct cmp_str 
{ 
    bool operator()(char const *a, char const *b) 
    { 
     return std::strcmp(a, b) < 0; 
    } 
}; 

int main (int argc, char ** argv) 
{ 

    std::map<const char*, int, cmp_str> map; 

    map["aa"] = 1; 
    map["ca"] = 2; 
    map["ea"] = 3; 
    map["ba"] = 4; 

    map["ba"] = 5; 
    map["bb"] = 6; 

    map["ba"] = 7; 

    std::map<const char*, int, cmp_str>::iterator it = map.begin(); 
    for (; it != map.end(); it++) 
    { 
     std::cout << (*it).first << ": " << (*it).second << std::endl; 
    } 

    return 0; 

} 

Output

aa: 1 
ba: 7 
bb: 6 
ca: 2 
ea: 3 
+0

Tôi nghĩ rằng hoạt động loại memcmp của nó sâu xuống. – Whyrusleeping

+1

Bất kỳ lý do cụ thể nào tại sao bạn không chỉ sử dụng 'std :: string' làm khóa? – nneonneo

+0

Giáo sư của tôi đã viết hàm 'cmp_str' ở trên và tôi nêu ra câu hỏi, anh ta không có câu trả lời cho câu hỏi. Tôi chạy một vài thử nghiệm và không thể đi qua trường hợp cạnh vỡ, nhưng tôi vẫn flummoxed đến cách nó hoạt động, như tôi muốn giả định nó sẽ chỉ chèn một mục nhập vào bảng. – travis

Trả lời

6

Các container ra lệnh tất cả sử dụng lớp tương đương: Hai giá trị ab được coi là tương đương nếu không ai nhỏ hơn khác: !(a < b) && !(b < a) hoặc, nếu bạn nhấn mạnh vào các ký hiệu sử dụng một vị nhị phân !pred(a, b) && !pred(b, a).

Lưu ý rằng bạn cần giữ con trỏ trực tiếp trong bản đồ của bạn: nếu con trỏ nằm ngoài phạm vi, bạn sẽ nhận được kết quả lạ. Tất nhiên, chuỗi ký tự vẫn hợp lệ trong suốt thời gian sống của chương trình.

6

Vâng, cmp_str có thể được sử dụng để tìm chìa khóa giống hệt nhau. Nếu cả hai số cmp_str::operator(x,y)cmp_str::operator(y,x) trả lại false, bạn đã tìm thấy khóa trùng lặp. Có thực sự không nhiều hơn với nó.

+0

@ Prætorian yup, thx. –

+1

Một bình luận về downvote sẽ mang tính xây dựng. –

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