std :: list永远循环,范围问题?

时间:2014-05-10 18:01:07

标签: c++ list loops scope iterator

我有一个Node类。它包含x,y坐标,id和保存相邻节点的Node指针列表。

我遇到了类中列表数据结构的问题。 printAdj()函数工作正常但我需要通过使用adjList函数获取adjs()成员来遍历类外部的节点的邻接列表。

class Node{
public:
    // constructors & destructors
    Node(double x, double y, unsigned id) : x_(x), y_(y), 
                                            id_(id) {}

    // setters & getters
    std::list<Node*> adjs() const   { return adjList;   }


    // member functions
    void addAdj(Node* n) { adjList.push_back(n); }

    void printAdj() const{
        for(std::list<Node*>::const_iterator it = adjList.begin(); 
                                             it != adjList.end() ; ++it){
            std::cout << "\t" << (*it)->id() <<  " " << std::endl;
        }
    }


private:
    std::list<Node*> adjList;
    double x_, y_;
    unsigned id_;
};

外部循环永远运行。

list<Node*> RRT_graph;  //global

void print(){
    for(list<Node*>::const_iterator it = RRT_graph.begin() ;
                                    it != RRT_graph.end() ; ++it){

        cout << "Node ID: " << (*it)->id() << "\tX: " << (*it)->x() 
                                           << "\tY: " << (*it)->y() << endl;

        cout << "\tAdjacency List:" << endl;
        (*it)->printAdj();    // member function correctly prints adjacency list

        // nothing wrong with the size, it displays correctly
        cout << "-----------------------------------" << endl;
        cout << "(" << (*it)->adjs().size() << ")" << endl; 

        // but when the list is looped, it goes forever.
        unsigned count = 0;            
        for(list<Node*>::const_iterator ite = (*it)->adjs().begin() ; 
                                        ite != (*it)->adjs().end() ; ++ite)
            cout << count++ << endl;


}

由于两个邻接列表打印循环是相同的,只有成员函数有效,我怀疑这里有一个范围问题,但我有点迷失。

这里有什么问题?

1 个答案:

答案 0 :(得分:1)

只需在adjs()中返回const引用即可。目前它正在返回一个副本,因此当您在(*it)->adjs().begin()(*it)->adjs().end()中使用迭代器时,它会为不同的副本提供迭代器

    const std::list<Node*>& adjs() const   { return adjList;   }