我可以在cpp中使用带向量的嵌套循环吗?

时间:2015-05-04 23:46:22

标签: c++

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

1 个答案:

答案 0 :(得分:6)

一个主要问题是你的getNodes函数返回了一个向量的副本,而不是原始向量。因此,在循环中使用的迭代器不会迭代相同的向量。

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

一般来说,返回矢量副本没有错。但是,当您执行此操作时,如果您确实需要副本而不是相同的向量,则必须确保调用此类函数。根据您的使用情况使用getNodes函数,就您要完成的工作而言,它不是一个有效的用法。

错误在于:

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

修复:

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

后者确保返回对相关实际向量的引用,而不是实际向量的副本。如果您希望仍然具有可用的功能,则可以添加另一个函数,该函数将向量作为副本返回。