2010-07-12 30 views
9

Hãy nói rằng tôi có một bộ sưu tập của các đối tượng Person, mỗi trong số đó trông như thế này:Vùng chứa STL nào cho dữ liệu đặt hàng có quyền truy cập dựa trên khóa?

class Person 
{ 
    string Name; 
    string UniqueID; 
} 

Bây giờ, các đối tượng phải được lưu trữ trong một container cho phép tôi ra lệnh cho họ để tôi có thể đưa ra mục X một cách dễ dàng xác định vị trí mục X + 1 và X-1.

Tuy nhiên, tôi cũng cần truy cập nhanh dựa trên UniqueID, vì bộ sưu tập sẽ lớn và tìm kiếm tuyến tính sẽ không cắt nó.

'Giải pháp' hiện tại của tôi là sử dụng danh sách std :: cùng với sơ đồ std ::. Danh sách chứa Persons (để truy cập theo thứ tự) và bản đồ được sử dụng để ánh xạ UniqueID để tham chiếu đến mục danh sách. Cập nhật 'vùng chứa' thường bao gồm việc cập nhật cả bản đồ và danh sách.

Nó hoạt động, nhưng tôi cảm thấy cần phải có cách làm thông minh hơn, có thể là boost:bimap. Gợi ý?

EDIT: Có một số nhầm lẫn về yêu cầu của tôi đối với "đặt hàng". Để giải thích, các đối tượng được truyền theo tuần tự từ một tệp và 'thứ tự' của các mục trong vùng chứa phải khớp với thứ tự tệp. Thứ tự không liên quan đến ID.

+1

Bạn có ý nghĩa gì với 'X + 1' và' X-1'? Tôi có cảm giác nó không ám chỉ đến trường 'UniqueID', vậy nó là gì? Bạn đang đề cập đến thứ tự gì? –

+0

Tôi đang đề cập đến thứ tự trong vùng chứa. tức là (giả định một vectơ) Mảng [X], [X-1] và [X + 1] – Roddy

+1

Thứ tự trong thùng chứa là gì? Tôi nghĩ đó là những gì Matthieu đang cố gắng nắm bắt. – Joel

Trả lời

8

boost:bimap là lựa chọn hiển nhiên nhất. bimap được dựa trên boost::multi_index, nhưng bimap có cú pháp đơn giản. Cá nhân tôi sẽ thích boost::multi_index hơn boost::bimap vì nó sẽ cho phép dễ dàng thêm các chỉ mục khác vào cấu trúc Person trong tương lai.

+0

Nhân tiện, hãy đặt câu hỏi cho người bản ngữ: 'chỉ mục' hoặc 'chỉ mục'? –

+3

'Chỉ số' là danh từ số nhiều về mặt kỹ thuật chính xác.Nhưng everone sẽ hiểu 'chỉ số' ... – Roddy

+0

Cảm ơn. Tôi đã tìm thấy rằng toolchain của tôi (C++ Builder 2010) không hỗ trợ tăng :: multi_index hoặc bimap, nhưng hey, ít nhất tôi biết những gì tôi * nên * được sử dụng. – Roddy

7

Không có vùng chứa Thư viện chuẩn nào làm những gì bạn muốn - vì vậy bạn sẽ phải sử dụng hai vùng chứa hoặc giải pháp Tăng cường. Nếu sử dụng hai thùng chứa, tôi thường thích một véc tơ hoặc một deque trên một danh sách, trong hầu như tất cả các trường hợp.

+0

@Neil, Cảm ơn. Sử dụng một vectơ có nghĩa là việc xóa hoặc chèn một mục có thể làm mất hiệu lực TẤT CẢ các tham chiếu trong bản đồ của tôi. Do đó danh sách. – Roddy

+0

@Roddy: Tôi không chắc chắn về các yêu cầu của bạn, nhưng tôi có ý tưởng rằng bạn sử dụng danh sách của mình làm hàng đợi. Nếu tôi sai, thì xin vui lòng sửa tôi, nhưng nếu tôi đúng, thì giải pháp 'deque' của Neil có ý nghĩa. –

+0

@Matthieu, Đáng buồn là không: Tôi vẫn cần chèn/xóa ngẫu nhiên sẽ không làm mất hiệu lực vị trí của tất cả các mục khác. – Roddy

1

Tại sao không sử dụng hai bản đồ, một trong đó có Person là Key và một cái khác có UniqueId là Key, nhưng điều đó đòi hỏi phải cập nhật cả hai.

bạn có thể tạo chức năng gọi lại để cập nhật cả bản đồ bất cứ khi nào có bất kỳ thay đổi nào.

+0

"bạn có thể tạo chức năng gọi lại ..." Ah - làm thế nào để làm điều đó ?? – Roddy

+2

Bằng cách phát minh lại Bimap :) –

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