#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; }
Ваше использование непрерывной памяти позволяет необработанным указателям функционировать как итераторы.