我有一個圖表,其中包含頂點和邊的自定義屬性。我現在想創建這個圖的一個副本,但我不希望頂點的複雜程度與原始圖一樣複雜。通過這個,我的意思是,頂點具有與原始圖中相同的索引(vertex_index_t)就足夠了。
而是做手工拷貝的,我想使用boost的複製功能::的adjacency_list(S http://www.boost.org/doc/libs/1_37_0/libs/graph/doc/adjacency_list.html):用於Boost圖表(BGL)的自定義InputIterator
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的模型。
這裏是我到目前爲止succeded:
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呢?