gpt4 book ai didi

c++ - 我可以在 cpp 中使用带 vector 的嵌套循环吗?

转载 作者:行者123 更新时间:2023-11-30 00:49:00 25 4
gpt4 key购买 nike

我有一个 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

ma​​in.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;
}

最佳答案

一个主要问题是您的 getNodes 函数返回 vector 的拷贝,而不是原始 vector 。因此,您在循环中使用的迭代器不会迭代同一 vector 。

相反,您在嵌套循环中使用的迭代器迭代 4 个不同(但等效)的 vector ,而不是来自相关对象的实际 vector 。

一般来说,返回 vector 的拷贝并没有错。但是,当您执行此操作时,如果您真的想要一个拷贝,而不是相同的 vector ,则必须确保调用这样的函数。按照您使用的方式使用 getNodes 函数,就您要实现的目标而言,它不是有效的用法。

错误在这里:

inline vector<Node*> getNodes()  { return nodes; }

修复:

inline vector<Node*>& getNodes() { return nodes; }

后者确保返回对所讨论的实际 vector 的引用,而不是实际 vector 的拷贝。如果您希望仍然具有可用的功能,您可以添加一个附加函数以将 vector 作为拷贝返回。

关于c++ - 我可以在 cpp 中使用带 vector 的嵌套循环吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30041907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com