[英]Indexing vectors in a for loop
這是對“最低節點的返回名稱”的后續操作,僅在現在有了更多的進展和更少的錯誤。
就像上次一樣,這是一門大學課程,所以即使粘貼成功,復制粘貼也不會對我最有利。
我現在遇到的問題與LeastDistance函數中向量的索引有關,因為在調試器的內部和外部運行代碼時,都會產生運行時異常,並帶有向量下標超出范圍的消息。 如果有人比我更熟悉向量庫,則相關的行是1804。在同一函數中訪問for循環時會觸發此行。
for (int j = 0; j < hnode[i].nodes.size(); j++)
到目前為止,我已經編寫了一個小的輔助函數GetIndex,但是我不確定該函數的代碼是否正確以及如何在LeastDistance函數本身中實現它。 下面的完整代碼(為粗制濫造的格式表示歉意,此處的編輯讓我有些痛苦)。
#include "stdafx.h"
#include<iostream>
#include<vector>
#define INF = 9999;
using namespace std;
struct Node
{
char nodeLink; //adjacent link
int cost; //cost of a link
}; //to use in Dijkstra algorithm
class HeadNode
{
public:
char Name;
bool Visited;
vector<Node> nodes;
HeadNode(char x) { Name = x; Visited = false; }
};
class Graph
{
char Start = 'A';
char StartNode;
char CurrentNode;
char Destination;
int TotalCost = 0;
vector<HeadNode> hnode;
vector<char> path;
vector<int> weight;
public:
Graph();
void createHeadNode(char X);
void createAdjMatrix();
char LeastDistance(char node);
void printAdjMatrix();
void Dijkstra(char StartNode, char Destination);
void DestinationChangeCaller();
char GetStartNode();
int GetIndex(char CurrentNode);
};
int main()
{
Graph graph;
graph.createHeadNode('A');
graph.createHeadNode('B');
graph.createHeadNode('C');
graph.createHeadNode('D');
graph.createHeadNode('E');
graph.createAdjMatrix();
graph.GetStartNode();
graph.DestinationChangeCaller();
system("pause");
return 0;
}
void Graph::DestinationChangeCaller()
{
for (Destination = 'A'; Destination <= 'E'; Destination++)
{
Dijkstra(StartNode, Destination);
}
}
Graph::Graph()
{
}
int Graph::GetIndex(char node)
{
return(node - 'A');
}
void Graph::createHeadNode(char x)
{
hnode.push_back(x);
}
char Graph::GetStartNode() // elementary get function with no error correction.
{
char got;
cout << "Please enter a node from A-E to start from: ";
cin >> got;
cout << endl;
return got;
}
void Graph::createAdjMatrix()
{
hnode[0].nodes.push_back({ 'B', 4 });
hnode[0].nodes.push_back({ 'C', 1 });
hnode[1].nodes.push_back({ 'A', 4 });
hnode[1].nodes.push_back({ 'C', 2 });
hnode[1].nodes.push_back({ 'D', 1 });
hnode[2].nodes.push_back({ 'A', 1 });
hnode[2].nodes.push_back({ 'B', 2 });
hnode[2].nodes.push_back({ 'D', 3 });
hnode[2].nodes.push_back({ 'E', 1 });
hnode[3].nodes.push_back({ 'B', 1 });
hnode[3].nodes.push_back({ 'C', 3 });
hnode[3].nodes.push_back({ 'E', 1 });
hnode[4].nodes.push_back({ 'C', 1 });
hnode[4].nodes.push_back({ 'D', 1 });
}
void Graph::printAdjMatrix()
{
cout << "The adjacency list that represents the graph is :";
for (int i = 0; i < hnode.size(); i++)
{
cout << endl;
cout << hnode[i].Name << " -> ";
for (int j = 0; j < hnode[i].nodes.size(); ++j)
{
cout << hnode[i].nodes[j].nodeLink << ", " << hnode[i].nodes[j].cost << ", ";
}
}
cout << endl;
cout << endl;
cout << endl;
for (int i = 0; i < hnode.size(); i++)
{
cout << "Shortest distance from node " << Start << " to node " << hnode[i].Name << " is:" << weight[i] << endl;
cout << "Shortest path is : ";
for (int j = 0; j < path.size(); j++)
{
cout << path[j] << endl;
}
}
}
char Graph::LeastDistance(char node)
{
int smallest = 9999;
char smallestNode = node;
int idx = 0;
int i = GetIndex(node);
for (int j = 0; j < hnode[i].nodes.size(); j++)
{
if ((node == hnode[i].Name) && (hnode[i].nodes[j].cost <= smallest) && (hnode[i].Visited == false))
{
smallest = hnode[i].nodes[j].cost;
smallestNode = hnode[i].nodes[j].nodeLink;
idx = i;
}
}
hnode[idx].Visited = true;
TotalCost = TotalCost + smallest;
return(smallestNode);
}
void Graph::Dijkstra(char StartNode, char Destination)
{
CurrentNode = StartNode;
if (CurrentNode == Destination)
{
cout << "the start is the destination, therefore the cost will be 0." << endl;
}
else
{
cout << StartNode << "->";
while (true)
{
if (CurrentNode != Destination)
{
CurrentNode = LeastDistance(CurrentNode);
cout << CurrentNode << "->";
}
else if (CurrentNode == Destination)
{
cout << endl;
cout << "The total cost of this path is:" << TotalCost;
cout << endl;
TotalCost = 0;//reset cost
break;
}
}
}
}
編輯:我已經從頂部更改了以下幾行,該錯誤已修復,但輸出仍未達到預期。
class Graph
{
char Start;
char StartNode;
char CurrentNode;
char Destination;
int TotalCost = 0;
vector<HeadNode> hnode;
vector<char> path;
vector<int> weight;
public:
Graph();
void createHeadNode(char X);
void createAdjMatrix();
char LeastDistance(char node);
void printAdjMatrix();
void Dijkstra(char StartNode, char Destination);
void DestinationChangeCaller(char Start);
char GetStartNode();
int GetIndex(char CurrentNode);
};
int main()
{
Graph graph;
graph.createHeadNode('A');
graph.createHeadNode('B');
graph.createHeadNode('C');
graph.createHeadNode('D');
graph.createHeadNode('E');
graph.createAdjMatrix();
graph.GetStartNode();
graph.DestinationChangeCaller(graph.GetStartNode());
system("pause");
return 0;
}
void Graph::DestinationChangeCaller(char Start)
{
for (Destination = 'A'; Destination <= 'E'; Destination++)
{
Dijkstra(Start, Destination);
}
}
可能還有其他問題,但這是一個問題:
char Graph::GetStartNode() // elementary get function with no error correction.
{
char got;
cout << "Please enter a node from A-E to start from: ";
cin >> got;
cout << endl;
return got;
}
因此,GetStartNode返回用戶輸入。 它不會更新成員變量StartNode
從main
調用時,您不使用返回值:
graph.createAdjMatrix();
graph.GetStartNode(); // <----- The return value isn't used
graph.DestinationChangeCaller();
所以在這里:
void Graph::DestinationChangeCaller()
{
for (Destination = 'A'; Destination <= 'E'; Destination++)
{
Dijkstra(StartNode, Destination);
^^^^^^^^^
}
}
StartNode未初始化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.