используя c , как мне реализовать itetator в моем собственном классе контейнера, чтобы я мог использовать что-то вроде std::sort()

#c #c 11 #iterator #containers

#c #c 11 #итератор #контейнеры

Вопрос:

я пытаюсь узнать, как реализовать функциональность итератора в моем собственном классе контейнера, чтобы я мог использовать что-то вроде std::sort()

я создал свой собственный класс контейнера. как мне теперь добавить функциональность итератора, например begin() , end() , …

 template <class T> class MyVector { public:
    MyVector() : m_DataPtr(NULL), m_nSize(0), m_nAllocated(0) {}
    ~MyVector() { delete m_DataPtr; }
    size_t Size() const { return m_nSize; }
    void PushBack(const T amp;data);

private:
    T *m_DataPtr;
    size_t m_nSize;
    size_t m_nAllocated; };

//******************************

template <class T> void MyVector<T>::PushBack(const T amp;data) {
    if (m_nSize == m_nAllocated)
    {
        m_nAllocated = (m_nAllocated 1) *2;
        T *tmp = new T[m_nAllocated];
        if (!tmp)
            return;

        // transfer data from ptr to tmp
        for (size_t i = 0; i < m_nSize; i  )
            tmp[i] = m_DataPtr[i];

        // delete[] ptr and set it to tmp
        delete[] m_DataPtr;
        m_DataPtr = tmp;
    }
    m_DataPtr[m_nSize  ] = data;
}
  

Комментарии:

1. В этом тривиальном случае вы можете просто использовать указатели T *begin(){return m_DataPtr;} и T *end(){return m_DataPtr m_nSize;} .

2. std::sort требуется категория итератора, называемая » итератор произвольного доступа «, требования к которой огромны. Это оставляет только один короткий ответ «использовать указатель». Если вы все еще хотите реализовать свой собственный указатель, это нормально, но вам понадобится вопрос получше, чем «как мне реализовать все это?»

Ответ №1:

Вы можете реализовать begin() и end() , добавив это в свое определение класса.

 T* begin() { return m_DataPtr; }
T* end() { return m_DataPtr   m_nSize; }
  

Ваше использование непрерывной памяти позволяет необработанным указателям функционировать как итераторы.