Reputation: 815
My graph class basically consists of a map
between values and Vertices
, where each Vertex
is a class of itself. Each Vertex has both a value and an adjacency list, which is implemented as a map
between adjacent Vertices
and edge weights. I'm trying to display each vertex in the graph along with the vertices it is adjacent to and the weight of the edge that connects it to its adjacent vertices. (sorry for all the code)
template <class VertexType>
void Graph<VertexType>::display() const
{
typedef map<VertexType, Vertex<VertexType> >::iterator vertices_iter;
typedef map<Vertex<VertexType>, int>::iterator adjList_iter;
for ( vertices_iter v_iter = vertices.begin(); v_iter != vertices.end(); v_iter++ )
{
cout << "Vertex: " << v_iter->second.value << endl;
cout << setw(25) << left << "Adjacent to: " << "Edge weight:\n";
for ( adjList_iter a_iter = vertices[v_iter->first].adjList.begin(); a_iter != vertices[v_iter->first].adjList.end(); a_iter++ )
cout << " " << a_iter->first.value << " " << a_iter->second << endl;
cout << endl;
}
}
But I get the following errors:
Error 1:
error C2440: 'initializing' : cannot convert from 'std::_Tree_const_iterator<_Mytree>' to 'std::_Tree_iterator<_Mytree>'
1> with
1> [
1> _Mytree=std::_Tree_val<std::_Tmap_traits<unsigned int,Vertex<unsigned int>,std::less<unsigned int>,std::allocator<std::pair<const unsigned int,Vertex<unsigned int>>>,false>>
1> ]
1> No constructor could take the source type, or constructor overload resolution was ambiguous
1> c:\users\user\desktop\cs m20a\topic g project 2\topic g project 2\graph.h(241) : while compiling class template member function 'void Graph<VertexType>::display(void) const'
1> with
1> [
1> VertexType=unsigned int
1> ]
Error 2:
error C2678: binary '[' : no operator found which takes a left-hand operand of type 'const std::map<_Kty,_Ty>' (or there is no acceptable conversion)
1> with
1> [
1> _Kty=unsigned int,
1> _Ty=Vertex<unsigned int>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\map(164): could be 'Vertex<VertexType> &std::map<_Kty,_Ty>::operator [](unsigned int &&)'
1> with
1> [
1> VertexType=unsigned int,
1> _Kty=unsigned int,
1> _Ty=Vertex<unsigned int>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\map(209): or 'Vertex<VertexType> &std::map<_Kty,_Ty>::operator [](const unsigned int &)'
1> with
1> [
1> VertexType=unsigned int,
1> _Kty=unsigned int,
1> _Ty=Vertex<unsigned int>
1> ]
1> while trying to match the argument list '(const std::map<_Kty,_Ty>, const unsigned int)'
1> with
1> [
1> _Kty=unsigned int,
1> _Ty=Vertex<unsigned int>
1> ]
and here is my Graph
class, if it helps.
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 ) const;
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
Upvotes: 1
Views: 439
Reputation: 26040
You're declaring the method as const
, that is, it won't change any of the member variables:
void Graph<VertexType>::display() const
This means you must utilize only const
methods of the underlying member variables; hence const_iterator
s for your underlying types:
typedef map<VertexType, Vertex<VertexType> >::const_iterator vertices_iter;
typedef map<Vertex<VertexType>, int>::const_iterator adjList_iter;
Better yet, if you're using C++11
, utilize auto
.
As for you second error, I can't see exactly what is causing it, however, you are doing lookup work for no reason:
for(auto a_iter = vertices[v_iter->first].adjList.begin();
a_iter != vertices[v_iter->first].adjList.end();
a_iter++ )
Say v_iter
is vertices.begin()
in the original loop. Then vertices[v_iter->first]
is effectively the same thing as *v.begin()
. You can replace this with:
for(auto a_iter = v_iter->first.adjList.begin();
a_iter != v_iter->first.adjList.end();
a_iter++ )
Upvotes: 1
Reputation: 2293
The problem is that
void Graph<VertexType>::display() const
is a const method, so every member of Graph is also const in it.
Here you use a non-const iterator
for ( vertices_iter v_iter = vertices.begin(); v_iter != vertices.end(); v_iter++ )
Try const iterator instead
typedef map<VertexType, Vertex<VertexType> >::const_iterator vertices_iter;
Upvotes: 1