2013-05-08 60 views
0

当我尝试删除char顶点图中的边时,它总是抛出一个异常,即在图中找不到一个或多个顶点。该代码适用于无符号图形。在地图中发现值<char, int>

在主,我有:

Graph<char> cGraph; 

cGraph.addVertex('a').addVertex('b'); 

cGraph.addEdge('a', 'b', 6); 

cout << "\n\nAttempt to remove an edge with existing vertices:\n\n"; 
    try 
    { 
     uGraph.removeEdge('a', 'b'); 
     cout << "Edge < 'a', 'b' > has been removed from the graph.\n"; 
    } 
    catch (GraphException& e) 
    { 
     cout << e.what(); 
    } 

的removeEdge功能:

template <class VertexType> 
void Graph<VertexType>::removeEdge(const VertexType& v, const VertexType& w) 
{ 
    // error checking 
    bool vIsInGraph = vertices.count(v) > 0, 
      wIsInGraph = vertices.count(w) > 0; 

    if (!vIsInGraph || !wIsInGraph) 
     throw GraphException("One or both vertices not found in graph. Edge not removed."); 

    if (findEdge(v, w) == vertices[v].adjList.end()) 
     throw GraphException("No edge exists between the two vertices. Edge not removed."); 

    // remove w from v's adjList and v from w's adjList 
    vertices[v].adjList.erase(w); 
    vertices[w].adjList.erase(v); 

    numEdges--; 
} // end remove 

AddVertex:

template <class VertexType> 
Graph<VertexType>& Graph<VertexType>::addVertex(const VertexType& newValue) 
{ 
    Vertex<VertexType> newVertex(newValue); 

    if (numVertices == MAX_VERTICES) 
    { 
     string MAX_VERTICES_s; 
     stringstream stream; 
     stream << MAX_VERTICES; 
     stream >> MAX_VERTICES_s; 
     throw GraphException("Adding vertex " + static_cast<string>(newVertex) + " to the graph would exceed the graph's maximum capacity of " + MAX_VERTICES_s + "." ); 
    } 

    vertices[newValue] = newVertex; 
    numVertices++; 

    return *this; 
} 

顶点:

template <class VertexType> 
class Vertex 
{ 
private: 
    static unsigned counter; 

    // each vertex in the graph has both a value and a list of other vertices it is adjacent to 
public: 
    static unsigned ID; 
    VertexType value; 
    // maps an adjacent vertex to the weight of the edge connecting the two vertices 
    map< VertexType, int > adjList; 

    Vertex() { ID = counter++; } 

    bool operator<(const Vertex& v) const; 
    Vertex(const VertexType& p_value) : value(p_value) {} 
    // allows a vertex to be converted to a string (for display purposes) 
    operator string() const; 
}; 

AddEdge:

template <class VertexType> 
Graph<VertexType>& Graph<VertexType>::addEdge(const VertexType& v, const VertexType& w, int weight) 
{ 
    // error checking 
    bool vIsInGraph = vertices.count(v) > 0, 
      wIsInGraph = vertices.count(w) > 0; 

    if (!vIsInGraph || !wIsInGraph) 
     throw GraphException("One or both vertices not found in graph. Edge not added."); 

    if (findEdge(v, w) != vertices[v].adjList.end()) 
     throw GraphException("An edge already exists between the two vertices. Edge not added."); 

    vertices[v].adjList[ w ] = weight; 
    vertices[w].adjList[ v ] = weight; 

    numEdges++; 

    return *this; 
} // end addEdge 

图形类的顶点声明:

template <class VertexType> 
class Graph 
{ 
private: 
    // list of all vertices in the graph. assumes non-duplicate data. 
    map< VertexType, Vertex<VertexType> > vertices; 

    const unsigned MAX_VERTICES; // Maximum number of vertices the graph can hold. 
    unsigned numVertices;   /** Current number of vertices in the graph. */ 
    unsigned numEdges;   /** Number of edges in the graph. */ 

    typename map< VertexType, int >::iterator findEdge(const VertexType& v, const VertexType& w) ; 

public: 
    Graph(unsigned max); 

    unsigned getNumVertices() const; 
    unsigned getMaxNumVertices() const; 
    unsigned getNumEdges() const; 
    int getWeight(const VertexType& v, const VertexType& w) const; 

    Graph<VertexType>& addVertex(const VertexType& newValue); 
    Graph<VertexType>& addEdge(const VertexType& v, const VertexType& w, int weight); 
    void removeEdge(const VertexType& v, const VertexType& w); 
    void BFS(const VertexType& v) const; 
    void display() const; 
}; // end Graph 
+0

也许你应该使用无符号整数,而不是字符。哈希字符时,我从来没有看过'std :: map'的源码,但可能会有一些愚蠢的事情发生。 – RandyGaul 2013-05-08 21:19:53

+2

@RandyGaul:'std :: map'不散列密钥。 – dalle 2013-05-08 21:21:25

+0

@dalle标题说地图,也许应该澄清? – RandyGaul 2013-05-08 21:22:10

回答

1

uGraph.removeEdge('a', 'b'); - >cGraph.removeEdge('a', 'b');

相关问题