Hi @DoNg,
Mình xin trả lời câu hỏi của bạn :
- Về mặt kỹ thuật:
Cách dùng này là không được vì kiểu của khóa của map<kiểu khóa, kiểu giá trị>
phải là kiểu dữ liệu so sánh được. Trong đó data là cấu trúc dữ liệu bạn tự định nghĩa, chưa có toán tử thứ tự.
Để giải quyết, bạn cần xây dựng toán tử thứ tự cho struct data:
typedef struct data
{
string name;
int color;
bool operator <(const data &Data)
{
return (this->name < Data.name);
}
}
Điều này có nghĩa là thứ tự được quyết định giữa 2 đối tượng kiểu data dựa vào thuộc tính name của nó, trong đó phép so sánh này giữa 2 kiểu dữ liệu string lại được quyết định nhờ operator khác được định nghĩa trong lớp string.
Ngoài ra, thuộc tính định thứ tự còn là thuộc tính quyết định sự duy nhất của khóa.
Ví dụ, nếu bạn so sánh dựa vào thuộc tính name thì có nghĩa là hai node A , B khác nhau sẽ được map < data, data > Graph;
coi là khác nhau nếu A.name != B.name, còn các thuộc tính khác không có giá trị quyết định sự khác nhau, ngoài ra, nếu A.name == B.name thì A,B khi truyền vào map làm key thì được coi như là một.
Theo mình thì nên so sánh dựa trên địa chỉ của data được cấp phát:
return (this < &Data);
// không chắc nữa
Truy cập hay chèn phần tử vào map có thể dùng qua toán tử [];
- Về mặt ý nghĩa:
Nếu bạn dùngmap < data, data > Graph;
để lưu danh sách cạnh thì có thể bị mất thông tin vì data đầu tiên trong map là khóa, do đó nó được lưu DUY NHẤT, nếu gán nó lần 2 thì nó chồng lên lần đầu:
VD:Lưu cạnh AB và AC:
Graph[A]=B
Graph[A]=C
==> Graph[A] cho kết quả là C, C đã ghi đè lên B.
Kiểm tra Graph.size()=1 :’(
Vì thế mình khuyên bạn gói 2 kiểu data sang 1 bên key:
map<string,bool>
, trong đó string là ghép của (A.name+B.name)
S= (A.name+B.Name); map[S]=true; S= (A.name+C.Name); map[S]=true;
Kiểm tra: Graph.size()=2 // (^_^)
Nếu không mình khuyên bạn dùng pair<string,string> làm khóa.
Mình nói có sai các bạn góp ý giúp nha.
`