我坚持为图形实现C ++ iterator
,它由邻接列表表示。
所以,我的想法是我的迭代器应该使用 DFS算法来浏览图形。
例如,对于++迭代器,它会转到当前顶点的下一个未访问的顶点(就像在简单的DFS中一样)。
我的图顶点和迭代器模板很简单:
template < typename VType, typename EType >
struct vertex {
typedef vertex < VType, EType > graph_vertex;
vertex (string _name, VType _v_data): name(_name), v_data(_v_data) { }
typedef pair < graph_vertex* , EType > ve;
vector <ve> adj; //adjacency list [ graph_vertex, edge_value ]
string name;
VType v_data;
bool marked; // for DFS
};
template < typename VType, typename EType >
class dfs_iterator {
public:
dfs_iterator();
dfs_iterator( graph_vertex* start );
~dfs_iterator();
dfs_iterator(const dfs_iterator& that);
dfs_iterator& operator = (const dfs_iterator& that) {
val = that.val;
}
dfs_iterator& operator ++ () { } // read down
dfs_iterator& operator -- () { } // read down
VType operator * () { return val->v_data; };
bool operator == (const dfs_iterator& that) const { return val == that.val; }
bool operator != (const dfs_iterator& that) const { return !(*this == that); }
private:
graph_vertex* val;
};
我想的事情:
在struct vertex
中应该是:
指针graph_vertex*
到顶点,它被迭代(++'ed)到
这个(当前)顶点(从当前顶点返回)。
我将其命名为graph_vertex* predecessor_vertex;
successor()和predecessor()函数将返回
指针graph_vertex*
指向下一个/上一个(对于DF搜索)顶点。
pseudocode successor(CURR_VERT):
for every graph_vertex VERT in CURR_VERT->ADJ LIST do {
if ( VERT not marked )
return VERT;
return successor (predecessor_vertex);
}
pseudocode predecessor(CURR_VERT):
return CURR_VERT->predecessor_vertex;
如果我以正确的方式思考,现在我为我的dfs_iterator获得了++
和--
(++ /的重载函数 - 将为当前顶点返回successor()/ predecessor()存储在迭代器中(当然,更改当前顶点的marked
标志)
但是我不明白如何处理这种情况,当用户为一个图创建大量迭代器时,graph_vertex
信息会因为marked
标志无法正确响应而损坏(一个迭代器可以改变它,然后第二个无法迭代这个顶点)。我应该在每个迭代器中存储一个特殊的vector
marked
个标志,而不是在顶点中吗?或以某种方式将此信息复制到graph_vertex
标记?
我应该为这个迭代器重载一些其他运算符吗?
请给我一些关于我的代码和此类实现的提示。我是否以正确的方式思考?
//实际上,我找不到任何关于这种图形迭代器的信息,而且我是C ++的新手。
答案 0 :(得分:2)
与算法相关的所有内容都应该在迭代器中,而不是在图中。更准确地说,您的迭代器不应该修改图形的状态。考虑一下const
图表上使用的迭代器。没有什么能阻止您在迭代器中使用很少的数据结构。例如,一种天真的方法是替换
bool marked; // for DFS
在你的类顶点中由迭代器本身中的一个映射。
std::map<struct vertex*, bool> visited_vertices