2016-03-23 37 views
1

Projemin birinde, nesnelerin bellek içi indekslerini oluşturmak istediğim bir duruma rastladım. Birincil dizin farklı bir anahtar kullanabilir ve ikincil endeksler bazı diğer elemanları anahtar olarak kullanır. SonraNesneleri kapsayıcılarda paylaşmanın en iyi yolu nedir?

std::map<string, Object> 

(yine tüm nesneler benzersiz dikkate örneğin std :: map) Başka bir kabı kullanarak ikincil endeksi için referans/işaretçi depolamak için en iyi yoldur gibi birincil dizin için std::map kullanıyorum varsa Nesne ek kopyalar yapmadan? sarkan işaretçiler veya referanslar (I Nesne birincil dizinden silinir ideal zaman olduğunu biliyoruz riskini poz ham işaretçileri veya referanslar kullanılması

  • , bakımı da ikincil dizininden kaldırmak için alınması ancak edilmelidir olur işaretçileri/birincil endeksi için konteyner içten kendini ayarlamak ikincil endekslerde referanslar geçersiz?)

    std::map<string, const Object*>

  • Veya birincil indeksi ve weak_ptr ikincil endekste shared_ptr yılların kullanarak kombinasyon std::map<string, std::shared_ptr<Object>> // primary index std::map<string, std::weak_ptr<Object>> // secondary index

Her iki yaklaşım için de artıları ve eksileri olduğunu biliyorum. Özellikle, nesneleri birincil kapsayıcıya doğrudan yerleştirme esnekliğini kaybetmek istemiyorum, ancak ikincil dizinin de Nesneleri tekrar kopyalamasını istemiyorum. Akıllı işaretleyicileri yalnızca ikincil dizin için kullanma zorluğu, Nesneye sahip olmayacaklarıdır.

Yardım için şimdiden teşekkür ederiz.

+1

Nesne başvuruda bulunmak için birincil anahtarı kullanmaya ne dersiniz? std :: map // ikincil indeks, değer birincil anahtardır '. Bunun dezavantajı, nesneyi bulmak için başka bir haritaya ihtiyacınız var. : P –

+0

Nesne için çok adımlı başvurular olabilir mi? Maliyet neredeyse iki katına çıkacak. –

+0

Nesnelere akıllı işaretçiler kullanmanızı öneririm. İşaretçileri bir 'std :: vektör'üne yerleştirin. Ardından, endeksleri oluşturun, ör. 'std :: map', nesneye bir anahtar ve akıllı bir işaretçi kullanarak. –

cevap

1

Nesnelerinizi bir kapsayıcıya yerleştirin. Nesnelerin ekleme/silinme sıklığına bağlı olarak, öğelerini referanslara uygun olmayan bir kapsayıcıyı kullanmayı düşünebilirsiniz, örneğin bir std::list veya std::deque. Daha sonra, haritalarınız için referansları kullanarak, yani std::reference_wrapper kullanarak nesneleri (veya üyelerinden herhangi birini) referans verin.

Arka plan depolarının yanı sıra endeksleri de içine alacak şekilde, nesneleri eklediğinizde veya kaldırdığınızda, endekslerden geçersiz referanslar çıkardığınızdan ve yeni referanslar ekleyeceğinizden emin olun.

Bu sayede, sadece bir kez nesnelerinizi saklamak ve akıllı işaretçiler kullanarak dolaşmak zorundasınız. Bu, sadece nesnelerin gerçekten sahibi olmanız ve yaşam sürelerini kontrol etmeniz ve eğer indisleri kapsülleyebiliyorsanız (bunları güncel tutmak için) sadece işe yarar.

İlgili konular