Как написать стандартный итератор C ++? - PullRequest
4 голосов
/ 18 сентября 2011

У меня есть следующий простой Graph класс, где для каждого Node я сохраняю набор исходящих Arcs:

#include <iostream>
#include <vector>
#include <map>
#include <set>

struct Arc {
  char label;
  int targetNode;
};

struct Graph {
  std::vector<int> nodes;
  std::map< int, std::set<Arc*> > outgoingArcsPerNode;
};

Как я могу предоставить стандартный C ++ iterator сверхвсе дуги в графе (порядок итераций не имеет значения), который скрывает, как дуги хранятся в графе?

Я хотел бы использовать это подобно следующему:

int main() {
  Graph g;
  for (Graph::const_iterator it = g.arcsBegin(); it != g.arcsEnd(); ++it) {
    Arc* a = *it;
  }
}

Я слышал о boost::iterator, но меня это сбивает с толку.Может, кто-нибудь подскажет, как его использовать в этом случае?

Ответы [ 2 ]

2 голосов
/ 18 сентября 2011

Если вы не хотите использовать boost, посмотрите, что итераторы должны предоставить: STL документация .

В противном случае вы можете использовать boost итератор библиотеки .См. Учебник iterator_facade , который очень близок к тому, что вы просите.

1 голос
/ 18 сентября 2011

Создать класс, в котором есть два итератора: один над картой, а другой над множеством.

Каждый ++ применяется для установки итератора. Когда он достигнет конца, увеличьте итератор карты и переинициализируйте итератор набора.

Также вы можете использовать boost :: iterator_facade - это не поможет реализовать алгоритм итерации, но сведет к минимуму ваши усилия по обеспечению совместимости вашего итератора с ожиданиями STL ...

...