在 C++ 中引用向量

Posted

技术标签:

【中文标题】在 C++ 中引用向量【英文标题】:Referencing a vector in C++ 【发布时间】:2016-07-14 18:36:48 【问题描述】:

首先,请注意,我已经对我的问题的解决方案进行了广泛的研究,但似乎没有一个解决方案有效。我正在尝试创建一个图表。长话短说,我似乎无法为我的任何节点添加边,因为这样做的函数:

void pushEdge(node * dest, int weight) 
    edges.push_back(edge(this,dest,weight));

不引用实际的“边”向量。当我打印出边缘时,什么都没有打印出来,因为每个节点显然没有边缘,尽管我之前添加了它们。

如何在类函数中引用类向量?

代码:(如果你想运行这个,你会看到有 0 条边。

graph.h - 存储边、节点和图形类。

#pragma once
#include <vector>
#include <iostream>
#include <string>
#include <stdlib.h>

using namespace std;

class node;

class edge 
public:
    edge()
    edge(node * origin, node * dest, int weight) 
        this->origin = origin;
        this->dest = dest;
        this->weight = weight;
    
    node * origin;
    node * dest;
    int weight;

 ;

class node 
public:
node()
node(int x, int y, int t) 
    this->x = x;
    this->y = y;
    this->t = t;


vector<edge> edges;
int x; int t; int y;

void pushEdge(node * dest, int weight) 
    edges.push_back(edge(this,dest,weight));


void printEdges() 
    cout << "NODE (" << this->x << "," << this->y << "): " << edges.size() << " edges!" << endl;
    for (int i = 0; i < edges.size(); i++) 
        edge at = edges.at(i);
        cout << "EDGE: Origin(" << at.origin->x << "," << at.origin->y << ") Target(" << at.dest->x << "," << at.dest->y << ") Weight: " << at.weight << endl;
    

;

class graph 
public:
graph()
node nodes[900] = ;

void printNodes() 
    cout << "Node count: " << sizeof(this->nodes) << endl;
    for (int i = 0; i < 900; i++) 
        this->nodes[i].printEdges();
    

;

source.cpp - 生成图表并将其打印出来。

#include <iostream>
#include "graph.h"

using namespace std;

graph genGraph();

int main() 
graph myGraph = genGraph();
myGraph.printNodes();


graph genGraph() 
graph myGraph;
int i = 0;
for (int x = 1; x <= 30; x++) 
    for (int y = 1; y <= 30; y++) 
        node myNode(x, y, 0);
        myGraph.nodes[i] = myNode;
        i += 1;
    

for (int i = 0; i < 900; i++) 
    node myNode = myGraph.nodes[i];
    int x = myNode.x; int y = myNode.y;
    if (x > 1) 
        node nodeLeft = myGraph.nodes[i-30];
        myNode.pushEdge(&nodeLeft, 2);
        if (y > 1) 
            node nodeTopLeft = myGraph.nodes[i-31];
            myNode.pushEdge(&nodeTopLeft, 2);
        
        if (y < 30) 
            node nodeBottomLeft = myGraph.nodes[i-29];
            myNode.pushEdge(&nodeBottomLeft, 2);
            cout << myNode.edges.size() << endl;
        
    
    if (x < 30) 
        node nodeRight = myGraph.nodes[i+30];
        myNode.pushEdge(&nodeRight, 2);
        if (y > 1) 
            node nodeTopRight = myGraph.nodes[i+29];
            myNode.pushEdge(&nodeTopRight, 2);
        
        if (y < 30) 
            node nodeBottomRight = myGraph.nodes[i + 31];
            myNode.pushEdge(&nodeBottomRight, 2);
        
    
    if (y > 1) 
        node nodeTop = myGraph.nodes[i - 1];
        myNode.pushEdge(&nodeTop, 2);
    
    if (y < 30) 
        node nodeBottom = myGraph.nodes[i + 1];
        myNode.pushEdge(&nodeBottom, 2);
    

return myGraph;

谢谢, 最大K

【问题讨论】:

试试 Boost Graph 库怎么样? 你试过读教科书吗? @Slava 我非常了解图形的概念。我的问题是引用向量。 带有指向相当短暂对象的指针的全局向量不是一个好主意。 @MaxK 我不是指关于图形的教科书,我是指 C++ 教科书。 【参考方案1】:

看来问题出在

node myNode = myGraph.nodes[i];

在那里创建节点 i 的副本。您可以创建参考:

node& myNode = myGraph.nodes[i];

【讨论】:

是的,解决了!我不敢相信我没有意识到问题出在引用节点上。 现在如果我运行它,结束边的坐标值为 -858993460。想法? @MaxK for (int i = 0; i &lt; 900; i++) 迭代 900 nodes。你只赚了 30 个。另外 870 个 nodes 里有什么?没有人知道,因为 node 默认构造函数 (node()) 没有做任何事情。可能是随机垃圾,可能是打开地狱之门的密码,可能是莎士比亚全集翻译成斯瓦希里语。考虑使用vectorpush_back 而不是900 元素数组。 @user4581301 再次查看那些双 for 循环。 30x30 = 900。是的,我的原始代码中有一个向量,但我将其更改为原始数组,因为每次保证有 900 个节点,因此数组在存储方面似乎是明智的。 @MaxK 你有我。只剩下我能想到的就是你没有一直贯彻约翰伦德伯格的建议,并且仍在打印超出范围的本地人的指针。例如。这里完全相同的错误:node nodeLeft = myGraph.nodes[i-30]; 和代码中的十几次。

以上是关于在 C++ 中引用向量的主要内容,如果未能解决你的问题,请参考以下文章

引用二维向量中的元素 (c++)

如何在 C++ 中通过引用返回向量

向量迭代器不可取消引用 C++

C++:试图理解通过引用传递向量

C++ 通过引用传递向量字符指针

当我在 C++ 中只有对向量的引用时如何更改向量中的对象