2012-09-26 15 views
6

vấn đề rất đơn giản: Chúng tôi có một lớp học có các thành viên a, b, c, d ... Chúng tôi muốn tìm kiếm nhanh (giá trị khóa của một thành viên) và cập nhật danh sách lớp với giá trị mới bằng cách cung cấp giá trị hiện tại cho a hoặc b hoặc c ... Tôi đã nghĩ đến việc có một bó số
std::map<decltype(MyClass.a/*b,c,d*/),shared_ptr<MyClass>>.Đang sử dụng bản đồ có giá trị là std :: shared_ptr là một lựa chọn thiết kế tốt để có danh sách các lớp được lập chỉ mục đa?

1) Đó có phải là một ý tưởng hay không?

2) Tăng chỉ số đa cấp cao hơn giải pháp thủ công này theo mọi cách?

PS SQL nằm ngoài câu hỏi vì lý do đơn giản/hoàn hảo.

+0

"* Tăng chỉ số đa cấp cao hơn giải pháp thủ công này theo mọi cách? *" MultiIndex chưa hỗ trợ ngữ nghĩa di chuyển. : - [ – ildjarn

Trả lời

7
  1. Boost MultiIndex có thể có một nhược điểm riêng biệt mà nó sẽ cố gắng để giữ tất cả các chỉ số cập nhật sau mỗi đột biến của bộ sưu tập. Đây có thể là một hình phạt hiệu suất lớn nếu bạn có một giai đoạn tải dữ liệu với nhiều lần viết riêng biệt.

  2. Các mẫu sử dụng của Boost Multi Index có thể không phù hợp với kiểu mã hóa (và hương vị ...) của dự án (thành viên). Điều này sẽ là một bất lợi nhỏ, nhưng tôi nghĩ rằng tôi muốn đề cập đến nó

  3. Như ildjarn đề cập, Tăng MI không hỗ trợ ngữ nghĩa di chuyển như được nêu ra

Nếu không, tôi muốn xem xét việc tăng cường MultiIndex vượt trội trong hầu hết các trường hợp, vì bạn không thể đạt được số lượng thử nghiệm mà nó nhận được.

+0

về số lượng thử nghiệm .... nó là một so sánh khó khăn kể từ khi giải pháp thủ công có rất ít thử nghiệm nhưng cũng ít hơn rất nhiều LOC – NoSenseEtAl

+0

Điều tốt nó chỉ là ý kiến ​​của tôi, sau đó :) - Ít nhất là Boost LOC đã được xem xét ngang hàng bởi nhiều cặp mắt hơn so với hầu hết các đội trong nhà có thể đủ khả năng. – sehe

1

Bạn muốn cân nhắc chứa tất cả bản đồ của mình trong một lớp, tùy ý quyết định một trong các vùng chứa như một đối tượng lưu trữ đối tượng "thực" và sau đó chỉ sử dụng std::map với loại con trỏ thô được ánh xạ cho các thành phần của std::map đầu tiên.

Điều này sẽ khó khăn hơn một chút nếu bạn cần tạo bản sao của những bản đồ đó.

+0

Hoặc chỉ các trình vòng lặp vào bản đồ đầu tiên thay vì các con trỏ thô đến các phần tử của nó. –

+0

Tôi sai khi nghĩ rằng sizeof shared_ptr so với sizeof iterator không phải là vấn đề lớn, đặc biệt vì bản đồ iirc có 3 con trỏ trên mỗi phần tử – NoSenseEtAl

+0

@ChristianRau Iterator vào bản đồ đầu tiên tôi nghĩ sẽ là một cách sai lầm đối với hầu hết các ứng dụng. Họ sẽ yêu cầu bạn làm một cái gì đó như 'map.find (key) -> second-> second' thay vì chỉ' map.find (key) -> second'. Bạn đang thêm một lớp bổ sung của indirection cho không có lợi ích. –

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