I have the following structs:
struct Arco {
int i, j;
Arco () {};
Arco (const Arco& obj): i(obj.i), j(obj.j) {};
Arco(int _i, int _j) : i(_i), j(_j) {}
};
struct ARCO_TEMPO {
Arco a;
int slotTimeU;
int slotTimeV;
ARCO_TEMPO () {};
ARCO_TEMPO (const ARCO_TEMPO& obj): a(obj.a), slotTimeU(obj.slotTimeU), slotTimeV(obj.slotTimeV) {};
ARCO_TEMPO (Arco _a, int _slotTimeU, int _slotTimeV, int _order) : a(_a), slotTimeU(_slotTimeU), slotTimeV(_slotTimeV) {}
};
struct CICLO {
vector<ARCO_TEMPO> arco_tempo;
set<ARCO_TEMPO> arco_tempo_order;
set<int> arco_tempo_Aux;
int aircraftType;
float COST;
};
Throughout my algorithm, I create CICLOs and store them in a set (because I need to bulk up I will not keep repeating cycles).
I then defined the following operators:
bool operator<(const ARCO_TEMPO& obj1, const ARCO_TEMPO& obj2) {
if (obj1.slotTimeU < obj2.slotTimeU) {
return true;
}
else {
if (obj1.slotTimeU == obj2.slotTimeU && obj1.slotTimeV < obj2.slotTimeV) {
return true;
}
else {
if (obj1.slotTimeU == obj2.slotTimeU && obj1.slotTimeV == obj2.slotTimeV && obj1.a.i < obj2.a.i) {
return true;
}
else {
if (obj1.slotTimeU == obj2.slotTimeU && obj1.slotTimeV == obj2.slotTimeV &&obj1.a.i == obj2.a.i && obj1.a.j < obj2.a.j ) {
return true;
}
else{
return false;
}
}
}
}
}
bool operator==(const ARCO_TEMPO& obj1, const ARCO_TEMPO& obj2) {
if (obj1.slotTimeU == obj2.slotTimeU && obj1.slotTimeV == obj2.slotTimeV &&obj1.a.i == obj2.a.i && obj1.a.j == obj2.a.j ) {
return true;
}
}
bool operator<(const CICLO& obj1, const CICLO& obj2) {
if (obj1.COST < obj2.COST - 1) {
return true;
}
else {
if ( (abs(obj1.COST - obj2.COST) < 1) && obj1.aircraftType < obj2.aircraftType) {
return true;
}
else {
if (obj1.aircraftType == obj2.aircraftType && (abs(obj1.COST - obj2.COST) < 1) && obj1.arco_tempo_order.size() < obj2.arco_tempo_order.size()) {
return true;
}
else {
if (obj1.aircraftType == obj2.aircraftType && (abs(obj1.COST - obj2.COST) < 1) && obj1.arco_tempo_order.size() == obj2.arco_tempo_order.size()) {
bool igual = true;
set<ARCO_TEMPO>::iterator itobj1;
set<ARCO_TEMPO>::iterator itobj2;
for (itobj1 = obj1.arco_tempo_order.begin(), itobj2 = obj2.arco_tempo_order.begin(); itobj1 != obj1.arco_tempo_order.end(); itobj1++,itobj2++) {
if (igual && *itobj1 < *itobj2) {
return true;
}
else {
if (*itobj1 == *itobj2) {
igual = true;
}
else {
return false;
}
}
}
return false;
}
else{
return false;
}
}
}
}
}
// estrutura que guarda os ciclos criados
set<CICLO> ConjCiclos;
//crio um ciclo
CICLO cc;
// preencho esse ciclo ...
// antes de adiciona o ciclo verifico se e ele ja nao foi adicionado através da função:
bool is_CycleIT_a_new_one(CICLO &it, set<CICLO> &ConjCiclos) {
return ConjCiclos.count(it) == 0;
}
However, it happens to add in Conjuncts, one or another repeated cycle. Debugging the code, I realized that the operator == defined for the struct ARCO_TEMPO, is not working.
When I change the comparison of two ARCOs_TEMPO in the operator < of the struct CYCLE:
if (*itobj1 == *itobj2) {
by:
if (itobj1->a.i == itobj2->a.i && itobj1->a.j == itobj2->a.j && itobj1->slotTimeU == itobj2->slotTimeU && itobj1->slotTimeV == itobj2->slotTimeV) {
The algorithm works ok, without adding repeated cycles.
Can anyone tell me what is wrong with setting my operator ==?