Reputation: 23
I am running into trouble trying to access the methods of an object stored in a vector. I know that getEdges returns an unordered map of edge but I am missing something with how to reference a Vertex object from within a vector. Help?
In void UndirectedGraph::minSpanningTree():
std::vector<Vertex*> visited;
if(vertices.begin() != vertices.end())
{
visited.push_back(vertices.begin()->second);
visited[0]->distance = 0;
}
else
{
return;
}
std::vector<Vertex*>::const_iterator vit;
vit = visited.begin();
std::unordered_map<std::string, Edge> edges;
edges = vit -> getEdges();
In const std::unordered_map & Vertex::getEdges() const:
return edges;
The error:
UndirectedGraph.cpp:112:21: error: member reference base type 'Vertex
*const' is
not a structure or union
edges = vit -> getEdges();
~~~ ^ ~~~~~~~~ 1 error generated.
--EDIT--
Changing
edges = vit -> getEdges();
to
edges = *(vit)->getEdges();
gave me the same error.
Upvotes: 2
Views: 8032
Reputation: 119877
vit
is an iterator. Iteratirs work like pointers to container elements. Your container element type is Vertex*
. Therefore vit
works like Vertex**
.
To call a member function given a Vertex** p
you would have to get to a Vertex*
first. This can be done by dereferencing p
like this:
(*p)
and at this point you can call your member function like
(*p)->getEdges()
Iterators are no different.
Note
*(p)->getEdges()
is totally different from the above (and wrong). It is the same as
*((p)->getEdges())
and
(p)->getEdges()
is the same as
p->getEdges()
which is known not to work.
On a related note, if you are using raw pointers you are probably doing it wrong. You should either store Vertex
objects directly in an std::vector<Vertex>
or use shared_ptr
or unique_ptr
in lieu of raw pointers.
Upvotes: 8