2009-05-28 45 views
5

Tôi sẽ giữ bản tóm tắt này.Xóa phần tử bản đồ theo giá trị

Tôi đang cố giữ bản đồ giữa các chuỗi và các con trỏ đối tượng, và như vậy, tôi sử dụng std :: map. Tôi có một người quản lý là một lớp toàn cầu theo dõi bản đồ, và bất cứ khi nào một destructor của đối tượng được gọi, nó nói với người quản lý rằng nó đã bị xóa.

Cách duy nhất tôi có thể nghĩ là tìm kiếm qua bản đồ cho đối tượng. Có một giải pháp STL hiệu quả cho vấn đề này? Bản đồ có hiệu quả trong việc tìm kiếm bằng khóa cũng tồn tại không?

Trả lời

8

Không có cách nào hiệu quả để thực hiện việc này với std :: bản đồ khác ngoài việc lặp qua so sánh các giá trị.

Tuy nhiên phần lớn thời gian, khóa của giá trị được tính từ chính giá trị đó. Ví dụ, sử dụng thuộc tính Name của đối tượng Person làm khóa. Người quản lý có thể lưu trữ danh sách các cặp khóa/giá trị trái ngược với chính giá trị đó không. Điều này sẽ giải quyết vấn đề của bạn mà không cần phải viết lại một thuật toán mới.

Hoặc cách khác bạn có thể giữ bản đồ ngược lại trên lớp người quản lý. Về cơ bản giá trị cho khóa. Bằng cách đó bạn có thể sử dụng nó để tính toán chìa khóa để loại bỏ sau này.

+0

Cảm ơn! Tôi thậm chí không nghĩ đến việc có đối tượng lưu trữ chính khóa đó. Chắc chắn là một giải pháp tốt hơn so với việc có một bản đồ thứ hai. –

+0

+1, tôi sẽ xóa câu trả lời của tôi vì nó có vẻ giống với câu trả lời của bạn. –

1

Hãy xem thư viện Boost Multi-Index Containers.

+0

Lưu ý rằng bạn cần cả khóa và giá trị để là duy nhất để sử dụng bản đồ hai chiều. std :: bản đồ chỉ yêu cầu các khóa duy nhất. –

4

Nhìn vào SGI's documentation for the STL,

Bản đồ có tính chất quan trọng mà chèn một yếu tố mới vào một bản đồ không làm mất hiệu lực lặp rằng điểm đến yếu tố hiện có. Xóa phần tử khỏi bản đồ cũng không vô hiệu hóa bất kỳ trình vòng lặp nào, ngoại trừ, trong số khóa học, đối với các trình vòng lặp thực sự là trỏ đến phần tử đang bị xóa .

Vì vậy, bạn có thể lưu một trình vòng lặp vào bản đồ bên trong đối tượng của mình và sử dụng khóa đó làm khóa tra cứu liên tục khi bạn cần xóa mục nhập của nó.

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