Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, na1s, Вы писали:
NBN>Я учился — читая STL, пытался понять — зачем сделано так, а не иначе. И соответственно по каждому вопросу лез в учебник.
Я просто не смог понять, как описать итератор. В учебнике много нет. А понять STL полностью, я пока не в силах.
Здравствуйте, na1s, Вы писали:
N>Здравствуйте, NikeByNike, Вы писали:
NBN>>Здравствуйте, na1s, Вы писали:
NBN>>Я учился — читая STL, пытался понять — зачем сделано так, а не иначе. И соответственно по каждому вопросу лез в учебник. N>Я просто не смог понять, как описать итератор. В учебнике много нет. А понять STL полностью, я пока не в силах.
В твоем случае итератором является указатель на T.
Здравствуйте, NikeByNike, Вы писали:
NBN>Настоятельно рекомендую сначала почитать Страуструпа, Мейерса, Саттера, Александреску и иже с ними.
Я просто не смог понять, как описать итератор????
Т.е в структура класса vector и как туда присобачить iterator???
Здравствуйте, na1s, Вы писали:
N>как описать итератор?
Итак.
Итератор — это обобщение указателя на элемент массива. То есть объект, у которого есть те же характеристики, что и у указателя:
class your_iterator : std::iterator< your_iterator_tag, your_value_type >
{
public:
your_iterator(); // можно сконструировать без параметров. будет указывать в никуда (аналог NULL)
your_iterator(const your_iterator& src); // можно копировать
// (не обязательно писать этот конструктор руками - компилятор сам умеет их делать)
your_iterator& operator=(const your_iterator& src); // можно переприсваивать
// та же ремарка
// будучи указателем...
your_value_type& operator*() const; // разыменовав итератор, получаем ссылку на элемент
your_value_type* operator->() const; // другая форма разыменования, ведущая к членам элемента
// будучи указателем на элементы коллекции: над ним определена адресная арифметикаbool operator==(const your_iterator& rhs) const; // можно сравниватьbool operator!=(const your_iterator& rhs) const;
// ...для последовательного перебора - все итераторы
your_iterator& operator++();
your_iterator operator++(int) // пост-инкремент
{ your_iterator tmp(*this); ++*this; return tmp; }
// ...в обратную сторону (если контейнер это позволяет) - Bidirectional Iterator
your_iterator& operator--();
your_iterator operator--(int)
{ your_iterator tmp(*this); --*this; return tmp; }
// ...на произвольное смещение - Random Access Iterator
your_iterator& operator+=(ptrdiff_t delta);
your_iterator& operator-=(ptrdiff_t delta);
};
Наследование от std::iterator делает твой класс пригодным для работы с std::iterator_traits. Дело в том, что
— в ряде случаев нужно из типа итератора получить тип элемента
— некоторые алгоритмы по-разному реализуются для последовательных и произвольных итераторов
your_iterator_tag — это один из тэгов std:: input_iterator_tag, output_iterator_tag, forward_iterator_tag, bidirectional_iterator_tag, random_access_iterator_tag.
У вектора, естественно, итератор может быть произвольного доступа. Но там нужно слишком много операций над ним реализовывать.
Но, как тебе уже сказали, итератором вектора прекрасно работает обычный голый указатель. Все операции над ним определены прямо в языке.
Описываешь
template<class T>
class Vector
{
T* data_;
int size_;
.....
public:
typedef T* iterator;
typedef const T* const_iterator;
iterator begin() { return data_; }
iterator end() { return data_ + size_; }
// и то же самое для const
};