我有一个cpp问题,我不知道什么是错的..也许你可以帮助我:)。 我试图为图表实现数据结构。在这个图中,我将连接一些节点,这些节点具有小的欧氏距离,但在第二次迭代时,我的迭代器将指向0x0。如果我将这两个节点的距离给予std :: cout,则只出现这种情况。这是我的代码:
for(vector<Node*>::iterator n1 = g->getNodes().begin(); n1 != g->getNodes().end(); ++n1)
{
for(vector<Node*>::iterator n2 = g->getNodes().begin(); n2 != g->getNodes().end(); ++n2)
{
if(*n2 == 0)
{
// This will be entered after the first iteration of n2.
cout << "n2 null" << endl;
continue;
}
double distance = (*n1)->getDistance(*n2); // just euclidean distance
if(distance <= minDistance)
{
// This works fine:
cout << "(" << *n1 << "," << *n2 << ") << endl;
// This brings me a "Segmentation fault"
cout << "(" << *n1 << " , " << *n2 << ") -> " << distance << endl;
}
}
}
这是由嵌套循环所欠吗?任何人都可以告诉我我的错吗?非常感谢!
编辑:这是一些更多的代码: 的 node.h
#ifndef NODE_H_
#define NODE_H_
#include <vector>
#include <iostream>
#include <limits>
#include <math.h>
using namespace std;
class Node
{
private:
int x, y, z;
public:
Node(int x, int y, int z) : x(x), y(y), z(z)
{
}
inline int getX() { return x; }
inline int getY() { return y; }
inline int getZ() { return z; }
inline double getDistance(Node* other)
{
return sqrt(pow(x-other->getX(), 2) + pow(y-other->getY(), 2) + pow(z-other->getZ(), 2));
}
};
#endif
graph.h
#ifndef GRAPH_H_
#define GRAPH_H_
#include <vector>
#include "node.h"
using namespace std;
class Graph
{
private:
vector<Node*> nodes;
public:
~Graph()
{
while(!nodes.empty())
{
delete nodes.back(), nodes.pop_back();
}
}
inline vector<Node*> getNodes() { return nodes; }
inline int getCountNodes() { return nodes.size(); }
bool createNode(int x, int y, int z)
{
nodes.push_back(new Node(x, y, z));
return true;
};
#endif
main.cc
#include <iostream>
#include <vector>
#include <algorithm>
#include <math.h>
#include "model/graph.h"
using namespace std;
int main()
{
Graph *g = new Graph();
int nodeDistance = 100;
for(int z = 0; z <= 300; z += nodeDistance)
{
for(int x = 0; x <= 500; x += nodeDistance)
{
for(int y = 0; y <= 300; y += nodeDistance)
{
g->createNode(x, y, z);
}
}
}
for(vector<Node*>::iterator n1 = g->getNodes().begin(); n1 != g->getNodes().end(); ++n1)
{
for(vector<Node*>::iterator n2 = g->getNodes().begin(); n2 != g->getNodes().end(); ++n2)
{
if(*n2 == 0)
{
// This will be entered after the first iteration of n2.
cout << "n2 null" << endl;
continue;
}
double distance = (*n1)->getDistance(*n2); // just euclidean distance
if(distance <= nodeDistance)
{
// This works fine:
cout << "(" << *n1 << "," << *n2 << ") << endl;
// This brings me a "Segmentation fault"
cout << "(" << *n1 << " , " << *n2 << ") -> " << distance << endl;
}
}
}
delete g;
return 0;
}
答案 0 :(得分:6)
一个主要问题是你的getNodes
函数返回了一个向量的副本,而不是原始向量。因此,在循环中使用的迭代器不会迭代相同的向量。
相反,您在嵌套循环中使用的迭代器正在迭代4个不同(但等效)的向量,而不是来自相关对象的实际向量。
一般来说,返回矢量副本没有错。但是,当您执行此操作时,如果您确实需要副本而不是相同的向量,则必须确保调用此类函数。根据您的使用情况使用getNodes
函数,就您要完成的工作而言,它不是一个有效的用法。
错误在于:
inline vector<Node*> getNodes() { return nodes; }
修复:
inline vector<Node*>& getNodes() { return nodes; }
后者确保返回对相关实际向量的引用,而不是实际向量的副本。如果您希望仍然具有可用的功能,则可以添加另一个函数,该函数将向量作为副本返回。