while I understand the BFS conceptually I haven't grasped how to use an iterator and a queue to implement the BFS. I'd really appreciate it if somebody could give me some insight how to properly use the iterator in my code. Thank you.
I'm not even sure if an iterator is a good idea here, I tried to learn the auto type too but I'm not sure how to use that.
#ifndef GRAPH_H
#define GRAPH_H
#include<vector>
#include<iostream>
using namespace std;
struct vertex;
struct adjVertex{
vertex *v;
};
struct vertex{
string name;
bool visited = false;
int distance = 0;
vector<adjVertex> adj;
};
class Graph
{
public:
void addEdge(string v1, string v2);
void addVertex(string name);
void displayEdges();
void breadthFirstTraverse(string sourceVertex);
int getConnectedBuildings();
private:
vector<vertex*> vertices;
};
#endif // GRAPH_H
void Graph::breadthFirstTraverse(string sourceVertex){
//first initialize everything as not found
for(int i = 0; i < vertices.size(); i++)
{
vertices[i]->visited = false;
}
//pointer to sourceVertex
vertex *vStart;
for(int i=0; i < vertices.size(); i++)
{
if(vertices[i]->name == sourceVertex){
vStart = vertices[i];
cout << "Starting vertex (root): " << vStart->name << " -> " << endl;
}
}
queue<vertex*> q;
vStart->visited = true;
q.push(vStart);
vertex *n;
vector<int>:: iterator i;
while(!q.empty()){
n = q.front();
q.pop();
for(i = n->adj.begin(); i != n->adj.end(); ++i){ // error: no viable overloaded '='
cout << n->adj[*i].v->name <<"(" << n->adj[*i].v->distance << ")" << " ";
if(!n->adj[*i].v->visited){
n->adj[*i].v->visited = true;
q.push(*i); //no matching member function for call to 'push'
}
}
}
}
Note: I solved my own question in the comments.