Help with c++ stl map and operator overloading
i'm trying to use the stl map with a class that i've created, from what i've gathered if i want开发者_JAVA技巧 an object of my class Vertex to be the key for the map, i should also overload the < operator, i've attempted to do this in the class Vertex the file graph.h can be seen below:
#ifndef GRAPH_H
#define GRAPH_H
class Vertex
{
private:
char vertex_name;
public:
Vertex(){};
Vertex(char n)
{
vertex_name = n;
}
//Method signatures
char get_name();
//overloaded operators
bool operator ==(Vertex other)
{
if(this.vertex_name == other.get_name())
{
return true;
}
else return false;
}
bool operator < (Vertex other)
{
if(this.vertex_name - other.get_name() < 0)
{
return true;
}
else return false;
}
};
class Edge
{
private:
Vertex source,destination;
int weight;
public:
Edge(){};
Edge(Vertex v1,Vertex v2,int w)
{
source = v1;
destination = v2;
weight = w;
}
//Method signatures
Vertex get_source();
Vertex get_destn();
int get_weight();
};
class Graph
{
private:
list<Vertex> V;
list<Edge> E;
map<Vertex,int> distances;
public:
Graph(list<Vertex> vertex_list,list<Edge> edge_list)
{
V = vertex_list;
E = edge_list;
}
// Method Signatures
bool add_vertex(Vertex);
bool remove_vertex(Vertex);
bool add_edge(Edge);
bool remove_edge(Edge);
int total_vertices();
int total_edges();
void initialize_distances(Vertex);
};
/*
* Methods for the Vertex class are defined first
*/
char Vertex::get_name()
{
return vertex_name;
}
/*
* Methods for the Edge class are defined next
*/
int Edge::get_weight()
{
return weight;
}
Vertex Edge::get_destn()
{
return destination;
}
Vertex Edge::get_source()
{
return source;
}
/*
* Methods for our Graph class
*/
bool Graph::add_vertex(Vertex u)
{
V.push_back(u);
}
bool Graph::add_edge(Edge e)
{
E.push_back(e);
}
//slightly more tricky will write code when it'll be required i.e. when i implement dfs or some other algo
//that requires addition and removal of edges and vertices
bool Graph::remove_vertex(Vertex u)
{
//first check if it exists
//when a vertex is removed then then all the edges that have it as either a source or a destination should also be removed
}
//
bool Graph::remove_edge(Edge e)
{
//much easier than removing a vertex
//check if the edge exists and if it does remove it from the list..
}
int Graph::total_edges()
{
return E.size();
}
int Graph::total_vertices()
{
return V.size();
}
void Graph::initialize_distances(Vertex source)
{
distances.clear();
for(list<Vertex>::iterator it=V.begin(); it != V.end();it++)
{
//todo : overload = for the class vertex
if( *it == source)
{
distances[*it] = 0;
}
else
{
distances[*it] = INT_MAX;
}
}
}
#endif //GRAPH_H
the c++ file that includes this header file bellman_ford.cpp is as below :
#include<iostream>
#include<list>
#include<map>
#include<climits>
using namespace std;
#include "graph.h"
int main()
{
Graph G = Graph(list<Vertex>(), list<Edge>());
int vertices;
cout<<"Enter the no. of vertices : ";
cin>>vertices;
for(int i=0;i<vertices;i++)
{
cout<<"Enter the name of the vertex( one character only ) : ";
char tmp;
cin>>tmp;
Vertex tmp_vertex = Vertex(tmp);
G.add_vertex(tmp_vertex);
}
char choice;
do
{
char tmp_src,tmp_destn;
int tmp_w;
cout<<"Enter edge( source, destn, weight)";
cin>>tmp_src>>tmp_destn>>tmp_w;
G.add_edge( Edge(Vertex(tmp_src),Vertex(tmp_destn),tmp_w) );
cout<<"Add another edge (y|n)? ";
cin>>choice;
}while( choice != 'n');
return 0;
}
i think i'm doing the overloading wrong, any pointers on how to go about it would be greatly appreciated.
The prototype for operator<
should be:
bool operator<(const Vertex& b) const { ... }
Same thing for your operator==
, should be const
, and take a const
reference.
The Vertex::get_name()
should also be const
.
I think you may need to make your operators const
bool operator< ( Vertex other ) const
You might also consider passing the other Vertex by const reference if the data is large, (which it doesn't seem to be in this case
bool operator< ( const Vertex & other ) const
The advice about const operators taking const references to the other instance is good advice, however what is the nature of the problem?
Please specify whether you are experiencing a compile time error, a runtime error, or just experiencing unexpected behaviour (the map is not sorted as you would prefer).
精彩评论