2010-12-14 26 views
54

Tôi không hiểu tại sao đa phương thức tồn tại nếu chúng ta có thể tạo bản đồ vectơ hoặc bản đồ các tập hợp. Đối với tôi chỉ có sự khác biệt là:Ưu điểm của đa phương thức trên bản đồ vectơ là gì?

  • sử dụng equal_range trong Multimap để nhận các yếu tố của một chìa khóa và trong bản đồ của vectơ chúng ta chỉ cần sử dụng [] điều hành và có véc tơ của các yếu tố.
  • sử dụng multimap.insert(make_pair(key,value)) trong multimap để thêm các thành phần và map_of_vectors[key].push_back(value) trong bản đồ vectơ.

Vậy tại sao sử dụng multimap? Đối với tôi, tốt hơn là nên có một véc tơ hơn hai vòng lặp để có được tất cả các giá trị của một khóa.

Câu hỏi này cũng áp dụng cho unordered_map của vectơ và unordered_multimap.

+6

Tôi phải thừa nhận rằng tôi chưa bao giờ hiểu mục đích của 'multimap':/ –

+0

Tôi hơi muộn trong câu hỏi nhưng multimap tiêu tốn nhiều bộ nhớ hơn bản đồ vectơ do các con trỏ bổ sung.Lý do duy nhất tôi sử dụng chúng là nếu tôi muốn giữ chìa khóa của mỗi phần tử (làm 'push_back' bạn sẽ không giữ nó) – Jcao02

+0

Multimap là tuyệt vời nếu bạn không chỉ muốn theo dõi các khóa trùng lặp với các giá trị khác nhau, nhưng bạn cũng muốn xóa bất kỳ cặp khóa/giá trị nào tại một thời điểm. Bản đồ các vectơ không phù hợp với điều đó và trong khi bạn có thể sử dụng bản đồ các danh sách, sẽ thuận tiện hơn khi sử dụng một bội số. – richizy

Trả lời

42

Tôi sẽ nói điều đó tùy thuộc vào việc tất cả các giá trị có cùng khóa đều có mối quan hệ mà bạn muốn giải quyết hay không.

Ví dụ: bạn có thường xuyên đi qua tất cả các phần tử có khóa X hoặc chuyển chúng sang một hàm hay không, v.v. Sau đó, nó thuận tiện hơn để có chúng trong thùng chứa riêng của họ, bạn có thể giải quyết trực tiếp.

Tuy nhiên, nếu bạn chỉ có một tập hợp các mục, có thể chia sẻ cùng một giá trị quan trọng, hay không, tại sao lại sử dụng vectơ ở giữa? Sẽ thuận tiện hơn khi chạy qua multimap với các trình vòng lặp hơn là có vòng lặp lồng nhau cho bản đồ, trường hợp vectơ.

Một cách khác để xem xét điều này: Nếu nhiều mục nhập cho mỗi khóa là rất phổ biến, cấu trúc của bạn hiệu quả hơn trong bản đồ, trường hợp vectơ. Nếu chúng hiếm khi xảy ra, thì ngược lại.

+2

Cảm ơn. Câu trả lời của bạn và Artyom cho tôi thấy một chút khác biệt. Tuy nhiên tôi vẫn không tin rằng multimap là hữu ích trong cuộc sống thực như bản đồ của vectơ. Nhưng đó là ý kiến ​​cá nhân của tôi;) –

-1

hai trình lặp ??? Tôi nghĩ rằng bạn là sai.

khi tôi sử dụng tiêu chuẩn :: for_each() hoặc bản sao khác của trên multimap, tôi chỉ sử dụng MỘT phạm vi lặp, và nó đơn giản hơn nhiều đáng lo ngại với vectơ cho mỗi khóa.

40

Có rất nhiều khác biệt quan trọng giữa multimap<x, y>map<x, vector<y>>

Một khi bạn đã chèn một giá trị vào Multimap, bạn biết rằng iterator sẽ vẫn hợp lệ cho đến khi bạn gỡ bỏ nó và đây là tài sản rất mạnh, bạn có thể Không có nó với bản đồ của vectơ.

multimap<x,y>::iterator p=mymap.insert(make_pair(a,b)); 

Các iterator vẫn có giá trị cho đến khi nó được xóa khỏi bản đồ, trong khi ở trường hợp thứ hai, nó sẽ không còn giá trị mỗi khi bạn thêm mục mới vào vector.

Cũng lưu ý rằng map<x, vector<y>> có thể có giá trị trống được đặt bằng khóa hiện tại, trong khi multimap thì không.

Đây là những thứ khác nhau hoạt động khác nhau.

Và thành thực mà nói, tôi bỏ lỡ đa phương thức bằng một số ngôn ngữ không cung cấp trong thư viện của họ.

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