试图显示我的Graph类,与STL映射迭代器有问题

时间:2013-05-08 07:43:21

标签: c++ map stl iterator

我的图表类基本上由值mapVertices之间的Vertex组成,其中每个map都是自己的类。每个顶点都有一个值和一个邻接列表,它在相邻Vertices和边权重之间实现为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; } } 。我试图在图表中显示每个顶点以及它与其相邻的顶点以及将其连接到其相邻顶点的边的权重。 (对不起所有代码)

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>          ]

但我收到以下错误:

错误1:

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>          ]

错误2:

Graph

这是我的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 课程,如果有帮助的话。

{{1}}

2 个答案:

答案 0 :(得分:1)

您将方法声明为const,也就是说,它不会更改任何成员变量:

void Graph<VertexType>::display() const

这意味着您必须仅使用基础成员变量的const方法;因此const_iterator为您的基础类型:

typedef map<VertexType, Vertex<VertexType> >::const_iterator vertices_iter;
typedef map<Vertex<VertexType>, int>::const_iterator adjList_iter;

更好的是,如果您使用C++11,请使用auto

至于你的第二个错误,我无法确切地看到导致它的原因,但是,你无缘无故地进行查找工作:

for(auto a_iter = vertices[v_iter->first].adjList.begin(); 
    a_iter != vertices[v_iter->first].adjList.end(); 
    a_iter++ )

在原始循环中说v_itervertices.begin()。然后vertices[v_iter->first]实际上与*v.begin()相同。您可以将其替换为:

for(auto a_iter = v_iter->first.adjList.begin(); 
    a_iter != v_iter->first.adjList.end(); 
    a_iter++ )

答案 1 :(得分:1)

问题在于

void Graph<VertexType>::display() const

是一个const方法,因此Graph的每个成员也都是const。

这里使用非const迭代器

for ( vertices_iter v_iter = vertices.begin(); v_iter != vertices.end(); v_iter++ )

尝试使用const迭代器

typedef map<VertexType, Vertex<VertexType> >::const_iterator vertices_iter;