提供错误值的向量迭代器
Vector iterator providing wrong value
我的 Graph 实现遇到问题,特别是函数 printGraph()
。这个函数包含一个循环来打印图的邻接表表示。如果我循环使用成员对象变量 adj
那么它会显示正确的输出:
0 : 1 2 2
1 : 0 2
2 : 0 1 0 3
3 : 2 3 3
但是,如果我使用 getter 方法 adjL()
那么它会给我一个错误的输出,即:
0 : 0 0 2
1 : 0 0
2 : 0 0 0 3
3 : 0 0 3
很可能我犯了一个愚蠢的错误,但我似乎无法理解。任何帮助表示赞赏。我想我无法理解如何使用 getter 方法 adjL()
.
返回的值
class UndirectedGraph {
//vector<vector <int> > adj;
public:
vector<vector <int> > adj;
UndirectedGraph(int vCount); /* Constructor */
void addEdge(int v, int w); /* Add an edge in the graph */
vector<int> adjL(const int v) const ; /* Return a vector of vertices adjacent to vertex @v */
void printGraph();
};
UndirectedGraph::UndirectedGraph(int vCount): adj(vCount) {
}
void UndirectedGraph::addEdge(int v, int w) {
adj[v].push_back(w);
adj[w].push_back(v);
edgeCount++;
}
vector<int> UndirectedGraph::adjL(const int v) const {
return adj[v];
//return *(adj.begin() + v);
}
void UndirectedGraph::printGraph() {
int count = 0;
for(vector<vector <int> >::iterator iter = adj.begin(); iter != adj.end(); ++iter) {
cout << count << " : ";
/*
for(vector<int>::iterator it = adj[count].begin(); it != adj[count].end(); ++it) {
cout << *it << " ";
}
*/
for(vector<int>::iterator it = adjL(count).begin(); it != adjL(count).end(); ++it) {
cout << *it << " ";
}
++count;
cout << endl;
}
}
int main() {
UndirectedGraph g(4);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 2);
g.addEdge(2, 0);
g.addEdge(2, 3);
g.addEdge(3, 3);
g.printGraph();
}
由于 adjL
奇怪地 returns 按值,以下行被打破:
for(vector<int>::iterator it = adjL(count).begin(); it != adjL(count).end(); ++it) {
您正在比较来自两个不同容器的迭代器,和您正在将一个迭代器存储到一个立即超出范围的临时对象,它的值立即变得不可能阅读而不会导致海森堡可能在他的坟墓里翻身。
adjL
应该 return 一个 const vector<int>&
.
我的 Graph 实现遇到问题,特别是函数 printGraph()
。这个函数包含一个循环来打印图的邻接表表示。如果我循环使用成员对象变量 adj
那么它会显示正确的输出:
0 : 1 2 2
1 : 0 2
2 : 0 1 0 3
3 : 2 3 3
但是,如果我使用 getter 方法 adjL()
那么它会给我一个错误的输出,即:
0 : 0 0 2
1 : 0 0
2 : 0 0 0 3
3 : 0 0 3
很可能我犯了一个愚蠢的错误,但我似乎无法理解。任何帮助表示赞赏。我想我无法理解如何使用 getter 方法 adjL()
.
class UndirectedGraph {
//vector<vector <int> > adj;
public:
vector<vector <int> > adj;
UndirectedGraph(int vCount); /* Constructor */
void addEdge(int v, int w); /* Add an edge in the graph */
vector<int> adjL(const int v) const ; /* Return a vector of vertices adjacent to vertex @v */
void printGraph();
};
UndirectedGraph::UndirectedGraph(int vCount): adj(vCount) {
}
void UndirectedGraph::addEdge(int v, int w) {
adj[v].push_back(w);
adj[w].push_back(v);
edgeCount++;
}
vector<int> UndirectedGraph::adjL(const int v) const {
return adj[v];
//return *(adj.begin() + v);
}
void UndirectedGraph::printGraph() {
int count = 0;
for(vector<vector <int> >::iterator iter = adj.begin(); iter != adj.end(); ++iter) {
cout << count << " : ";
/*
for(vector<int>::iterator it = adj[count].begin(); it != adj[count].end(); ++it) {
cout << *it << " ";
}
*/
for(vector<int>::iterator it = adjL(count).begin(); it != adjL(count).end(); ++it) {
cout << *it << " ";
}
++count;
cout << endl;
}
}
int main() {
UndirectedGraph g(4);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 2);
g.addEdge(2, 0);
g.addEdge(2, 3);
g.addEdge(3, 3);
g.printGraph();
}
由于 adjL
奇怪地 returns 按值,以下行被打破:
for(vector<int>::iterator it = adjL(count).begin(); it != adjL(count).end(); ++it) {
您正在比较来自两个不同容器的迭代器,和您正在将一个迭代器存储到一个立即超出范围的临时对象,它的值立即变得不可能阅读而不会导致海森堡可能在他的坟墓里翻身。
adjL
应该 return 一个 const vector<int>&
.