2016-03-18 5 views
2

私はDynamicArrayクラスを作成し、それに対してイテレータを実装しました。私の.cppファイルの1つは、長さがnのDynamicArrayにランダムな値が入力され、STLソートでソートされています。しかし、私は数時間のために手を加えてきましたし、常にパラメータとして(開始とソート実行しようとしたときに、このエラーを得て)とend()している:DynamicArrayクラスのイテレータを作成しようとしています。私のイテレータでSTLソートが動作しないのはなぜですか?

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

私は参考のために私のDynamicArrayのプロトタイプをあげます:

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); 
}; 

このエラーは何を意味しますか?どうすれば修正できますか?前もって感謝します。

答えて

2

イテレータがイテレータのC++ライブラリ要件を満たしていません。イテレータを作成するには、単にiteratorという名前を付けるのは簡単ではありません。イテレータの要件は、C++標準では30ページを超えます。

ほとんどの場合、カスタムイテレータを実装する最も簡単な方法は、std::iteratorテンプレートから継承することです。テンプレートは、カスタムイテレータの必要なすべての属性を合成するために、2つの必須パラメータと3つのオプションパラメータを取ります。

イテレータのコードを簡単に見て、順方向イテレータの要件をほぼサポートできるように見えるので、反復子クラスを継承してください。std::iterator<std::forward_iterator_tag,T>から試してみてください。

あなたがoperator++の演算子が壊れているため、私が「ほぼ」と言う理由があります。それらの戻り値は間違っており、ポストインクリメントバージョンも間違っています。これにより、イテレータが正しく動作することが妨げられることがあります。これを解決するまでは、C++ライブラリのいくつかのアルゴリズムを使用してください。しかし、最大の問題は、必要なイテレータの特性の実装が欠如していることです。

+0

OPがかなり高速にソートしたい場合、ランダムアクセスイテレータが必要になります。 – Yakk

関連する問題