2010-07-13 29 views
5

Tôi bắt đầu sử dụng std::multimap để lưu trữ nhiều giá trị bằng cùng một khóa, nhưng sau đó tôi phát hiện ra rằng nó không giữ thứ tự chèn giữa các giá trị với cùng một khóa. This answer tuyên bố rằng nó có thể được thực hiện với boost::multi_index::multi_index_container, nhưng không đưa ra ví dụ. Nhìn qua các tài liệu, không có ví dụ về cách sử dụng đó, và tôi không thể làm cho người đứng đầu hoặc đuôi của cách bạn đang sử dụng điều này. Tôi đã mong đợi tài liệu nghèo nàn từ các thư viện tăng ít được sử dụng hơn, nhưng điều này có bánh. Bất cứ ai có thể chỉ cho tôi một hướng dẫn hoặc ví dụ cho thấy nó được sử dụng theo cách tôi muốn, hoặc thậm chí có thể cung cấp một ví dụ cho mình?sử dụng boost multi_index_container để duy trì thứ tự chèn

+0

Bạn có cần đây là bản đồ đa không? – doublep

+0

vâng, tôi có. Tôi có nhiều giá trị với cùng một khóa. – rmeador

Trả lời

6

Bạn có thể đạt được điều này bằng cách sử dụng boost::multi_index với hai chỉ mục: ordered_non_unique (cho phép các giá trị có cùng khóa) và random_access (sẽ giữ thứ tự chèn).

struct some { 
    long key; 
    int data; 
    int more_data; 
    // etc. 
}; 

typedef multi_index_container< 
    some, 
    indexed_by<  
    random_access<>, // keep insertion order 
    ordered_non_unique< member<some, long, &some::key> > 
    > 
> some_mic_t; 
+1

Hỗ trợ câu trả lời này, từ tài liệu tăng cường: ** Các chỉ số truy cập ngẫu nhiên là các trình tự tự do có thời gian truy cập vị trí không đổi và trình vòng lặp truy cập ngẫu nhiên. Các phần tử trong chỉ mục truy cập ngẫu nhiên theo mặc định được sắp xếp theo thứ tự chèn ** –

0

Làm thế nào về một

map<int, vector<string> > 

hoặc

map<int, list<string> > 

@Kirill: Tốt câu trả lời. Tôi nghi ngờ random_access của Boost có thể khá chậm, vì nó sẽ buộc tất cả các chuỗi cho tất cả các phím được duy trì trong một cấu trúc liền kề duy nhất. Trong khi người hỏi chỉ đơn giản muốn thứ tự được giữ nguyên trong tập hợp các giá trị được ánh xạ của mỗi khóa.

+0

'random_access' là một chỉ mục bổ sung. Bạn sử dụng 'ordered_non_unique' để tìm kiếm, sau đó là' random_access' để lặp qua phạm vi kết quả. Nó không chậm. –

+0

(Tôi đã sử dụng multi_index rất nhiều, nhưng không phải ngẫu nhiên_index, vì vậy tôi không quá chắc chắn về bất kỳ điều này) @Kirill: Hai điểm: @rmeador muốn có thể "giữ lại thứ tự chèn giữa các giá trị với cùng một khóa ". Cho một khóa duy nhất, làm thế nào có thể toàn bộ chỉ số ngẫu nhiên được sử dụng để nhanh chóng đạt được điều này? Tôi nghi ngờ rằng cấu trúc tôi đề nghị có thể là cách duy nhất để làm điều này. và Tôi có nghĩa là việc chèn các phần tử mới có thể chậm hơn mức cần thiết vì toàn bộ chỉ mục ngẫu nhiên có thể đã lỗi thời. –

+1

@Kirill: Để làm rõ, một khi order_non_unique đã xác định một phạm vi (chưa phân loại) giá trị tương ứng với một khóa duy nhất, làm thế nào để bạn sau đó (nhanh) sử dụng random_access để sắp xếp tập hợp các giá trị đó? Tập hợp các giá trị đó có thể được trải đều trong một chỉ số random_access lớn. Lặp lại trong phạm vi random_access sẽ không giữ các khóa theo thứ tự. –

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