2012-07-08 15 views
9

STL'm (bu, g ++ 4.x.x ile birlikte gelir) harita gibi kapları uygulamak için kırmızı-siyah ağaçları kullandığını anlıyorum. STL'nin dahili kırmızı-siyah ağacını doğrudan kullanmak mümkün mü? Öyleyse nasıl? Eğer değilse, neden olmasın - STL kırmızı-siyah ağacı neden ortaya çıkarmıyor?STL'nin Kırmızı-Siyah Ağacı İç Uygulamasını Kullanma

Şaşırtıcı bir şekilde, google kullanarak bir cevap bulamıyorum.

Düzenleme: ekleme ekstra ayırıcı yapıcı çağrısına bir çözüm olarak kırmızı-siyah ağacını kullanarak araştırıyorum. Bakınız this question. STL'm harita uygulaması için kırmızı-siyah ağaçları kullanıyor. hiçbir şey farklı bir veri yapısını kullanarak bunları uygulamaktan birisini durdurma olsa set ve map ait

+0

"Ekstra ayırıcı kurucusunun araya girme çağrısına çözüm olarak kırmızı-siyah ağacı kullanarak araştırma yapıyorum." Uygun bir çözüm, bu özelliğe sahip olmayan standart konteynerlerin uygulanmasını kullanmaktır. C++ 11, durum bilgisi olan ayırıcıları gerektirir, bu nedenle bu C++ 11 özelliğini doğru şekilde destekleyen herhangi bir standart kitaplık daha mantıklı davranacaktır (yine de farklı ayırıcı örnekleri oluşturacak olsa da, yalnızca orijinal ayırıcı nesnesinden bunu gerçekleştirecektir). –

+0

@Prasoon - Burada size yardımcı olmaz çünkü yapıcının istediği herşeyi yapan temel ağaç uygulamasıdır. Gcc 4.1'den daha yeni bir derleyiciyi denemek bir seçenek (önceki soru [STL haritası için özel bellek ayırıcı]] (http: // stackoverflow) olacaktır.com/sorular/11373796/özel bellek ayırıcısı-için-stl-haritası)) –

cevap

7

Aslında - cevap çok basit ve gcc sürümünüzden bağımsız. Stl kaynak kodunu sgi's website'dan indirebilir ve uygulamaya bakın ve kendiniz için kullanın.

Örneğin, 3.2 sürümündeki, sen stl_tree.h dosyasında kırmızı-siyah ağaç uygulamasını ve stl_set.h kullanımına ilişkin bir örnek görebilirsiniz.

stl sınıflarının şablon sınıfları olduğundan, uygulamaların aslında başlık dosyalarının içinde olduğunu unutmayın.

2

En STL uygulamaları, inanıyorum kırmızı, siyah ağaçlar - Yanlış hatırlamıyorsam, C++ standart bir RB ağaç uygulanmasını gerektirmez. O OOP ilkelerinin ihlal edeceği

STL başkasının kütüphane kullanmak olsaydı bazı istenmeyen davranışlara yol açabilir altında yatan veri yapısını açığa .. maruz etmez. Yani, özellikle set ve map için, yalnızca set ve map veri yapılarına uygun olan yöntemlere erişime izin vermeniz gerekir. Altta yatan temsili açığa çıkararak, kullanıcının bir kopyasını set, içinde kötü olan bir kullanıcıya yönlendirmesine neden olabilirsiniz.

söyleniyor

doğrudan .. bunu kullanmak isteyeyim bir çok nasıl bağlı olacaktır yatan kırmızı siyah ağacını kullanmak için (bildiğim kadarıyla) bir yolu yoktur. Kendi kırmızı-siyah ağacınızı uygulamak büyük olasılıkla en iyi bahistir ya da 3. parti kütüphanelerimizi (belki Boost?) Kontrol edin.

3

Kullanılan veri yapısının kırmızı- siyah ağaç (örneğin, en az bir kez bir AVL ağacı olarak uygulanmıştır ve B-, B * veya B + ağacı gibi bir şey de iyi olabilir).

Gibi, aralıklarında almak için tek yol belirli uygulamaya bakmak ve (en azından deneyin) alenen ifşa olmayan şeyler yararlanmak olacaktır. Ben tüm uygulama ayrıntılarını açığa soyutlama bir girişim, var çünkü çoğunlukla düşünüyorum:

Neden olarak

.