У меня есть график с настраиваемыми свойствами для вершин и ребер. Теперь я хочу создать копию этого графика, но я не хочу, чтобы вершины были такими же сложными, как в оригинале. Под этим я подразумеваю, что будет достаточно, чтобы вершины имели одинаковые индексы (vertex_index_t), как и в исходном графе.
Вместо того, чтобы делать копирование вручную, я хотел использовать копировальную-функциональность повышения :: adjacency_list (ы http://www.boost.org/doc/libs/1_37_0/libs/graph/doc/adjacency_list.html.):Пользовательский InputIterator для диаграммы Boost (BGL)
template <class EdgeIterator>
adjacency_list(EdgeIterator first, EdgeIterator last,
vertices_size_type n,
edges_size_type m = 0,
const GraphProperty& p = GraphProperty())
Описание там говорит:
EdgeIterator должен быть моделью InputIterator. Тип значения EdgeIterator должен быть std :: pair, , где тип пары представляет собой целочисленный тип . Целые числа соответствуют вершинам, и они должны все падают в диапазоне от [0, n).
К сожалению, я должен признать, что я не совсем понимаю, как определить EdgeIterator, являющийся моделью InputIterator.
Вот что я до сих пор преуспели:
template< class EdgeIterator, class Edge >
class MyEdgeIterator// : public input_iterator< std::pair<int, int> >
{
public:
MyEdgeIterator() {};
MyEdgeIterator(EdgeIterator& rhs) : actual_edge_it_(rhs) {};
MyEdgeIterator(const MyEdgeIterator& to_copy) {};
bool operator==(const MyEdgeIterator& to_compare)
{
return actual_edge_it_ == to_compare.actual_edge_it_;
}
bool operator!=(const MyEdgeIterator& to_compare)
{
return !(*this == to_compare);
}
Edge operator*() const
{
return *actual_edge_it_;
}
const MyEdgeIterator* operator->() const;
MyEdgeIterator& operator ++()
{
++actual_edge_it_;
return *this;
}
MyEdgeIterator operator ++(int)
{
MyEdgeIterator<EdgeIterator, Edge> tmp = *this;
++*this;
return tmp;
}
private:
EdgeIterator& actual_edge_it_;
}
Однако, это не работает, как предполагается, и я выбежала из ключей.
Итак, как мне определить соответствующий InputIterator?