我有一个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;
}
由于两个邻接列表打印循环是相同的,只有成员函数有效,我怀疑这里有一个范围问题,但我有点迷失。
这里有什么问题?
答案 0 :(得分:1)
只需在adjs()
中返回const引用即可。目前它正在返回一个副本,因此当您在(*it)->adjs().begin()
和(*it)->adjs().end()
中使用迭代器时,它会为不同的副本提供迭代器
const std::list<Node*>& adjs() const { return adjList; }