Создание моих собственных итераторов

140
задан Lightness Races in Orbit 28 November 2012 в 17:39
поделиться

5 ответов

Необходимо использовать Повышение. Итераторы. Это содержит много шаблонов и понятий для реализации новых итераторов и адаптеров для существующих итераторов. Я записал статья об этой самой теме ; это находится в журнале ACCU в декабре 2008. Это обсуждает изящное решение (IMO) для точно Вашей проблемы: представление членских наборов от объекта, с помощью Повышения. Итераторы.

, Если Вы хотите использовать stl только, , книга Josuttis имеет главу по реализации Ваших собственных итераторов STL.

40
ответ дан Chinasaur 28 November 2012 в 17:39
поделиться

/ РЕДАКТИРОВАНИЕ: Я вижу, собственный итератор на самом деле необходим здесь (я неправильно читал вопрос сначала). Однако, я позволяю коду ниже стенда, потому что это может быть полезно при подобных обстоятельствах.

<час>

собственный итератор, на самом деле необходимый здесь? Возможно, достаточно передать все необходимые определения контейнеру, содержащему реальные точки:

// Your class `Piece`
class Piece {
private:
    Shape m_shape;

public:

    typedef std::vector<Point>::iterator iterator;
    typedef std::vector<Point>::const_iterator const_iterator;

    iterator begin() { return m_shape.container.begin(); }

    const_iterator begin() const { return m_shape.container.begin(); }

    iterator end() { return m_shape.container.end(); }

    const_iterator end() const { return m_shape.const_container.end(); }
}

Это предполагает, что Вы используете vector внутренне, но тип может легко быть адаптирован.

62
ответ дан Konrad Rudolph 28 November 2012 в 17:39
поделиться
  • 1
    это - хороший способ расположить И обрезать с единственным тегом. – rlemon 2 March 2013 в 09:05

Решением Вашей проблемы не является создание Ваших собственных итераторов, но использование существующих контейнеров STL и итераторов. Сохраните точки в каждой форме в контейнере как вектор.

class Shape {
    private:
    vector <Point> points;

то, Что Вы делаете с тех пор, зависит от Вашего дизайна. Лучший подход должен выполнить итерации через точки в методах в Форме.

for (vector <Point>::iterator i = points.begin(); i != points.end(); ++i)
    /* ... */

, Если Вам нужно к точкам доступа вне Формы (это могло бы быть меткой несовершенного дизайна) можно создать в методах Формы, которые возвратятся, функции доступа итератора для точек (в этом случае также создают общедоступное определение типа для контейнера точек). Посмотрите на ответ Konrad Rudolph для деталей этого подхода.

1
ответ дан Diomidis Spinellis 28 November 2012 в 17:39
поделиться

Можно считать этот ddj статья

В основном, наследоваться станд.:: итератор для получения большей части работы, сделанной для Вас.

15
ответ дан Default 28 November 2012 в 17:39
поделиться

Здесь Проектирование STL-подобного пользовательского контейнера - отличная статья, в которой объясняются некоторые основные понятия о том, как можно создать класс контейнера, подобный STL, и класс итератора для него. Обратный итератор (немного сложнее), хотя и оставлен в качестве упражнения: -)

HTH,

20
ответ дан 23 November 2019 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: