我正在尝试实现CLRS中提供的广度优先搜索算法。我是STL的新手,需要帮助才能添加边缘功能。在这里,我试图推动adjency列表中的节点。
enum eNodecolor{
WHITE,
GREY,
BLACK
};
struct sVertex{
int m_iValue;
eNodecolor m_visited;
public:
sVertex(int iValue) {
m_iValue = iValue;
}
};
class CGraph {
private:
std::map<sVertex, vector<sVertex*> > m_mapAdjList;
int m_iNoOfVertices;
public:
CGraph(int iNoOfVertices) {
m_iNoOfVertices = iNoOfVertices;
}
void addEdge(int iDataForSource, int iDataForDestination);
~CGraph(void){}
void bfs();
};
/* user will call function add edge with source data and destination data. */
void CGraph::addEdge(int iDataForSource, int iDataForDestination) {
// check if vertex exists in map if not create it
// Question: How can I check here if data for source exists in map.
// if not exists create vertex
sVertex* src = new sVertex(iDataForSource);
sVertex* dst = new sVertex(iDataForDestination);
vector<sVertex*> edge(m_iNoOfVertices);
edge.push_back(dst);
src->m_visited = WHITE;
std::pair<std::map<sVertex, vector<sVertex*> >::iterator,bool> ret;
m_mapAdjList.insert(pair<sVertex,vector<sVertex*> >(*src,edge));
ret = m_mapAdjList.insert ( std::pair<sVertex, vector<sVertex*> >(src, dst) );
}
}
如何在C ++中使用STL实现附件列表?
问题是我的初步设计是对的吗? 如果没有指导我正确的方向。
提供示例代码
由于
答案 0 :(得分:0)
我在您的实现中看到了两件事
您使用动态内存,但这不是必需的。只需将顶点添加到std::vector
std::map<sVertex, std::vector<sVertex> > m_mapAdjList;
如果图表中已存在新条目,则始终创建新条目,覆盖旧条目。因此,首先检查图中是否已存在顶点。您的addEdge()
可能看起来像
void CGraph::addEdge(int iDataForSource, int iDataForDestination) {
sVertex src(iDataForSource), dst(iDataForDestination);
auto &edge = m_mapAdjList[src];
edge.push_back(dst);
}
当然,您需要sVertex
的适当比较运算符。