2016-03-18 8 views
2

Bir DynamicArray sınıfı oluşturdum ve bunun için bir yineleyici uyguladı. .cpp dosyalarından biri, rastgele değerlerle dolu bir n uzunluğundaki DynamicArray'ını alır ve bunu STL sıralamasıyla sıralamalıdır. Ancak, ben birkaç saat tinkered ve her zaman parametre olarak bu tür ile (başlamak çalıştırmaya çalışırken zaman hatası) ve bitiş() aldık: Ben referans için benim DynamicArray prototip vereceğizDynamicArray sınıfım için bir yineleyici oluşturmaya çalışıyorum. STL sıralama neden yineleyicimle çalışmıyor?

no type named 'value_type' in 'struct std::iterator_traits<DynamicArray<double>::iterator>' 

:

template<class T> 
class DynamicArray { 
public: 
    static T dummy; 
    class iterator { // iterator for begin() and end() functions 
    private: 
    T* ptr; 
    public: 
    iterator() { ptr = NULL; } // constructor, sets pointer to NULL 
    iterator(T* p) { ptr = p; } // parameterized constructor, sets pointer to data in DynamicArray 
    const T& operator*() const { return *ptr; } // pointer operator, returns pointer 
    void operator++() { if(ptr) ptr++; } // pre-increment operator, increments pointer 
    void operator++(int) { if(ptr) ptr++; } // post-increment operator, increments pointer 
    bool operator!=(const iterator & other) { return ptr != other.ptr; } // does not equal operator 
    }; 
private: 
    T* data; 
    bool* inUse; 
    unsigned int size; 
    unsigned int capacity; 
public: 
    DynamicArray(); 
    DynamicArray(const DynamicArray<T> &); 
    virtual ~DynamicArray(); 
    DynamicArray<T> & operator=(const DynamicArray<T> &); 
    T operator[](unsigned int index) const; 
    T& operator[](unsigned int index); 
    unsigned int getSize() const; 
    unsigned int getCapacity() const; 
    bool containsKey(unsigned int index) const; 
    void deleteKey(unsigned int index); 
    iterator begin() const { return iterator(data); } 
    iterator end() const { return iterator(data + size); } 
    vector<unsigned int> keys() const; 
    void clear(); 
private: 
    void copy(const DynamicArray<T> &); 
    void deleteIt(); 
    void setCapacity(unsigned int newCap = 10); 
}; 

Bu hata ne anlama geliyor? Bunu nasıl düzeltebilirim? Şimdiden teşekkürler.

cevap

2

Yineleyiciniz, yineleyici için C++ kitaplık gereksinimlerini karşılamıyor. Bir yineleyici oluşturmak için sadece iterator numaralı bir şeyi adlandırmak kadar kolay değildir. Bir yineleyicinin gereksinimleri, C++ standardında 30 sayfadan fazladır.

Neredeyse tüm durumlarda, bir özel yineleyici uygulamanın en kolay yolu std::iterator şablonundan miras almanızdır. Şablon, özel yineleyicinin tüm gerekli özniteliklerini sentezlemek için gerekli iki parametreyi ve üç isteğe bağlı parametreyi alır.

Yineleyicinizin kodunu gözden geçirdiğinizde, hemen ileri yineleyiciler gereksinimlerini destekleyebileceğiniz gibi görünüyor, bu nedenle yineleyici sınıfınızı std::iterator<std::forward_iterator_tag,T>'dan devralmayı deneyin.

"Hemen hemen" deme nedenim, operator++ işleçlerinizin bozuk olmasıdır. Dönüş değerleri yanlış ve post-increment sürümü de yanlış. Bu, siz düzeltene kadar yineleyicinizin C++ kitaplığındaki bazı algoritmalar ile doğru çalışmasını engelleyebilir. Fakat en büyük probleminiz gereken yineleyici özelliklerin uygulanmasındaki eksikliktir.

+0

OP makul bir şekilde hızlı sıralamak istiyorsa, rasgele erişim yineleyici isteyecektir. – Yakk

İlgili konular