2009-04-25 15 views
11

Bir yineleyiciden geçtim ve bunu başka bir işleve iletmem gerekiyor - ancak bazı öğelerin atlanması için filtreleniyor (bu bir dizi işaretçi ve NULL işaretçisini filtrelemek istiyorum).boost :: filter_iterator - bunu STL ile nasıl yapardım?

Bunun nasıl yapılacağını görmek için "stl filter iterator" adresine baktım ve boost::filter_iterator ortaya çıktı.

Güzel görünüyor ve kullanabilirdim, ama bunu eski STL ile de yapabilir miyim? Unsurları yeni bir kaba kopyalamaksızın elbette.

Gerekli begin(), end() vb işlevlerini sağlayan başka bir yineleyici sınıfı oluşturmam gerekiyor ve filtreleme yapıyor mu? Yani tam olarak boostiterator_filter ... yeniden tanımlamak zorunda mıyım?

cevap

8

Doğru; Aslında filtre yineleyicisini kendiniz yeniden oluşturuyor olacaksınız. Tavsiyem Boost'un filter_iterator'ını kullanmak olacaktır. Boost, C++ 'nin en çok kullanılan harici kütüphanesi gibi özel bir statüye sahiptir; Pek çok C++ komitesi üyesi, kütüphanelerin destek için yazmalarına yardımcı oldu. Her yerde, her yerde olduğu gibi, aslında neredeyse-stl yapar; Direksiyonu yeniden icat etmek için hiçbir sebep yok.

+3

Biraz katılmıyorum: destek yüklemek zor olabilir ve bazen bu fazladan bağımlılık istemiyorsunuz. Bence * gerçek * sebebi 'filter_iterator' 'i tekrar yazmaz, doğru yazmak için oldukça zor (ve çok hantal) bir şeydir. –

4

rlbond ile katılıyorum. Tekerleği yeniden icat etmeyin ve Boost :: filter_iterator kullanın. Projenizde tüm destek kitaplıklarına sahip olmak istemiyorsanız, tam ihtiyacınız olanı ayıklamak için boost.bcp kullanmayı düşünebilirsiniz.