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