2010-11-10 23 views
13

tôi có thể cần phải suy nghĩ lại thiết kế tổng thể của tôi hơn một chút, nhưng vì nó đứng, có vẻ như tôi có thể muốn làm một cái gì đó như:Bạn có thể sử dụng tăng :: shared_ptr làm chìa khóa cho bản đồ không?

class A; 
class B; 
std::map<boost::shared_ptr<const A>, B> APtrToBMap; 

tôi đã cố gắng này, và nó dường như làm việc trong một trường hợp đơn giản (trình biên dịch không phàn nàn, và các xét nghiệm đơn giản dường như hoạt động). Nhưng tôi có suy nghĩ thứ hai về cách tiếp cận này. Tôi nghi ngờ có một số gotchas trong đó mà tôi không biết.

Vì vậy, giá trị trên có hợp lệ không? Hoặc là có một số lỗ hổng tôi không biết khi tôi làm điều này?

+1

những gì không hoạt động? –

+1

@Sam, chỉ vì bạn chưa phát hiện ra sự cố chưa có nghĩa là nó không tồn tại. Tôi nghĩ rằng đó là một ý tưởng tuyệt vời để hỏi về các vấn đề tiềm năng cho việc sử dụng không chuẩn như thế này. –

+0

Cảm ơn mọi người đã trả lời. Như một số bạn đã lưu ý, nó chủ yếu là một triệu chứng của một thiết kế xấu; Tôi đã cố gắng giải quyết một vấn đề ở sai chỗ. Tôi đã xem xét lại thiết kế của mình và không cần phải làm bản đồ xấu mà tôi đã hỏi. Các phản ứng về lý do tại sao đây là một ý tưởng tồi quá đã thực sự khai sáng; Tôi biết trong ruột của tôi nó sẽ không hoàn toàn làm những gì tôi đang tìm kiếm để làm; Tôi chỉ không thể thấy tại sao cho đến bây giờ. (Trong thực tế những gì tôi đã cố gắng để làm sẽ không làm việc với bản đồ tôi templated ở trên) – Taeolas

Trả lời

24

Các tài liệu tham khảo đã cho biết:

template<class T, class U> 
    bool operator<(shared_ptr<T> const & a, shared_ptr<U> const & b); // never throws 

Returns: một giá trị không xác định như vậy

  • hành < là một trật tự nghiêm ngặt yếu như mô tả trong phần 25,3 [lib.alg.sorting] của tiêu chuẩn C++;
  • dưới quan hệ tương đương được xác định bởi nhà điều hành <,! (Một < b) & &! (B < a), hai trường hợp shared_ptr là tương đương khi và chỉ khi họ chia sẻ quyền sở hữu hoặc đều trống rỗng.

Ném: không có gì.

Ghi chú: Cho phép đối tượng shared_ptr được sử dụng làm khóa trong vùng chứa liên kết.

+0

Tôi vui vì bạn tìm thấy điều này. Tôi đã đi đến kết luận ngược lại dựa trên một cái nhìn nhanh chóng tại tiêu đề, nhưng đó là dựa trên phân tích sai lầm của riêng tôi. –

+0

Mm. Tại sao hỗ trợ so sánh hai con trỏ khác nhau? – wilhelmtell

+1

nhưng tại sao một người muốn sử dụng shared_ptr làm khóa trong vùng chứa? – davka

0

Tôi không quen thuộc với con trỏ được chia sẻ, nhưng nếu có cách truy cập vào con trỏ ban đầu, bạn có thể sử dụng nó làm khóa (nếu bạn vẫn lo lắng vì lý do nào đó).

+0

Nhưng sau đó bản đồ sẽ không giữ shared_ptr khỏi phá hủy chính nó. Nếu bạn đã đặt shared_ptr vào bản đồ, thì bạn có thể làm cho nó như vậy mà tham chiếu duy nhất đến ptr đã được tìm thấy trong bản đồ. –

+0

Tôi không hiểu ... anh ta chỉ muốn một bản đồ của con trỏ đến đối tượng B, vì vậy tôi nói nếu anh ta sợ sử dụng ptr chia sẻ vì lý do nào đó, anh ta có thể sử dụng con trỏ. – robev

+0

Hoặc bạn có nghĩa là có một bản sao của shared_ptr trong bản đồ, nó sẽ giữ cho đối tượng bị xóa? – robev

4

Có, bạn có thể sử dụng con trỏ được chia sẻ làm khóa cho sơ đồ std :: nhưng đó là dấu hiệu chắc chắn về thiết kế bị hỏng. Nó sẽ được sắp xếp theo một số vị trí bộ nhớ ngẫu nhiên.

Câu hỏi của bạn hơi mơ hồ. Nếu bạn nói bạn sẽ sử dụng bản đồ đó như thế nào và bạn đang cố gắng lưu trữ những gì, bạn có thể nhận được nhiều câu trả lời hữu ích hơn.

+2

Bản đồ với thứ tự ngẫu nhiên vẫn hữu ích để tra cứu nhanh chóng dữ liệu được liên kết với nhưng không phải là một phần của đối tượng. Tôi sẽ không nhảy đến kết luận của một thiết kế bị hỏng. –

+0

@Mark Bạn có thể đưa ra một ví dụ không? Nếu khóa của bản đồ là một con trỏ, thì tại sao giá trị của bản đồ không phải là một phần của đối tượng? Hiệu quả là như nhau. –

+0

Nếu bạn muốn tìm kiếm dữ liệu dựa trên một đối tượng cụ thể thì sao? Tôi đã sử dụng điều này khá nhiều lần trong việc đính kèm dữ liệu vào các mục trong danh sách UI và như vậy khi API không cung cấp một phương pháp hợp lý để làm như vậy. –

0

Cẩn thận nếu bạn đang sử dụng điều này cùng với tăng :: python! Tất cả các hoạt động trong C++ dựa trên so sánh các đối tượng shared_ptr có thể thất bại nếu bạn truyền vào các đối tượng shared_ptr đó từ Python

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