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?
Mã
#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
Tôi nghĩ rằng hoạt động loại memcmp của nó sâu xuống. – Whyrusleeping
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
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