如何在const集中正确迭代?

1 c++ iterator const

我正在研究一个应该代表图形的程序.我的问题在于我的printAdjacencyList函数.基本上,我有一个Graph ADT,它有一个成员变量"nodes",它是该图的节点的映射.每个节点都有一组Edge*连接到它的边缘.我试图迭代图中的每个节点和节点的每个边缘.

void MyGraph::printAdjacencyList() {
std::map<std::string, MyNode*>::iterator mit;
std::set<MyEdge*>::iterator sit;

for (mit = nodes.begin(); mit != nodes.end(); mit++ ) {
    std::cout << mit->first << ": {";
    const std::set<MyEdge*> edges = mit->second->getEdges();
    for (sit = edges.begin(); sit != edges.end(); sit++) {
        std::pair<MyNode*, MyNode*> edgeNodes = *sit->getEndpoints();
    }
}
std::cout << " }" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

getEdges声明为:

const std::set<MyEdge*>& getEdges() { return edges; };
Run Code Online (Sandbox Code Playgroud)

并获取Endpoints声明为:

const std::pair<MyNode*, MyNode*>& getEndpoints() { return nodes; };
Run Code Online (Sandbox Code Playgroud)

我得到的编译器错误是:

MyGraph.cpp:63: error: request for member `getEndpoints' in 
`*(&sit)->std::_Rb_tree_const_iterator<_Tp>::operator->
[with _Tp = MyEdge*]()', which is of non-class type `MyEdge* const'

MyGraph.cpp:63: warning: unused variable 'edgeNodes'
Run Code Online (Sandbox Code Playgroud)

我已经发现这可能意味着我在某处滥用const,但我无法弄清楚我的生活在哪里.任何信息,将不胜感激.谢谢!

wil*_*ell 5

尝试更改sitconst_iterator.更改mitconst_iterator过,而你在它.此外,getEdges()getEndpoints()应该是const函数.最后,因为operator->()优先级高于一元operator*(),你可能想edgeNodes = (*sit)->getEndPoints()在内循环中说.

不是问题,但你应该考虑让迭代器实例作为循环的本地实例.