2015-05-21 23 views
6

Göstermek için, STL std::vector'u dahili olarak kullanmaktan daha özel bir kapsayıcı var. std::vector<char*>::iteratormy_container::iterator'a yazdıysam, yineleyicinin kaldırılması bir char* döndürecektir. Ancak, özel kapsayıcımın dahili içeriğini gizlemesi gerekir, yani bir char döndürmesi için bir dereferencing istiyorum.Bir STL kapsayıcısını özel bir yineleyicide sarmanın en iyi yolu nedir?

Bu nasıl başarılabilir?

class my_container { 
public: 

    typedef std::vector<char*> vector; 

private: 

    vector vec_; 

}; 

GÜNCELLEME

: char* bir örnektir. Bir C dizgisi anlamına gelmez; Örnek, bir int ile daha açık olacaktır.

Ayrıca, daha standart/güncel bir yaklaşım gibi göründüğünden std::forward_iterator_tag ve std::iterator kullanmak istiyorum.

+0

Kendi yineleyici, birini uygulamak gerekebilir o iki düzeyde (sizin KQUEUE operatör için 'Char gerçek yineleyici *' ve 'char') üzerinde dolaşır. –

+0

'char' nereden gelir, vektör içindeki her bir alt dizgeyi yinelemek mi yoksa yalnızca iki kez kaldırmayı mı kastediyorsunuz? – Barry

cevap

5

Kendi yineleyicinizi istiyorsanız, yalnızca yuvalanmış bir sınıf olarak yazmaya başlayın. Her zamanki işlemleri kesen bir std::vector<char*>::iterator sarmak gerekir (ör ++, *, --), gibi bir şey: bunu denemek ve Zorlandığınız durumlarda

class iterator 
{ 
    public: 
    iterator& operator++() { ++i_; return *this; } 
    char& operator*() { return **i_; } 
    ...etc... 

    private: 
    std::vector<char*>::iterator i_; 
}; 

, sizin girişimi sonrası Size daha fazla yardımcı olacağız.

1

kullanın boost::indirect_iterator:

tek yönlü boost.org en güzel millet tarafından tam olarak bu amaç için oluşturulmuş çok faydalı bir çerçeve kullanmaktır.

DÜZENLEME: (Test edilmemiş)

struct S 
{ 
    using iterator = 
     boost::indirect_iterator<std::vector<char*>::iterator>; 
    using const_iterator = 
     boost::indirect_iterator<std::vector<char*>::const_iterator>; 

    iterator begin() { return iterator(vec_.begin()); } 
    iterator end() { return iterator(vec_.begin()); } 
    const_iterator begin() const { return const_iterator(vec_.begin()); } 
    const_iterator end() const { return const_iterator(vec_.begin()); } 
private: 
    std::vector<char*> vec_; 
}; 
+1

cevabınızı, sorunun cevabını nasıl açıkladığını açıklayabilirsiniz. – mpromonet