如何在const集中正确迭代?

时间:2010-05-08 22:50:53

标签: 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;
}

getEdges声明为:

const std::set<MyEdge*>& getEdges() { return edges; };

并获取Endpoints声明为:

const std::pair<MyNode*, MyNode*>& getEndpoints() { return nodes; };

我得到的编译器错误是:

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'

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

3 个答案:

答案 0 :(得分:5)

尝试将sit更改为const_iterator。当你在它时,也会将mit更改为const_iterator。此外,getEdges()getEndpoints()应为const functions。最后,由于operator->()的优先级高于一元operator*(),因此您可能希望在内部循环中说edgeNodes = (*sit)->getEndPoints()

没有那么多问题,但你应该考虑将迭代器实例作为循环的本地实例。

答案 1 :(得分:2)

如果没有可编译的内容,很难说清楚,但是

const std::set<MyEdge*>& getEdges() { return edges; };

const std::pair<MyNode*, MyNode*>& getEndpoints() { return nodes; };

在技术上应该是const方法,因为它们不修改类并返回const引用。

const std::set<MyEdge*>& getEdges() const { return edges; };
const std::pair<MyNode*, MyNode*>& getEndpoints() const { return nodes; };

这与const_iterator结合使用可能会解决您的常量问题。


但是,您的特定错误可能是*it->foo() = *(it->foo())(*it)->foo()不同

答案 2 :(得分:1)

s/std::set<MyEdge*>::iterator sit;/std::set<MyEdge*>::const_iterator sit;/

和mit一样。换句话说,const_iterator就是你需要的。