C++ 如何定义运算符<;对于一个结构?

C++ 如何定义运算符<;对于一个结构?,c++,struct,operators,C++,Struct,Operators,我有以下文件: 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 ()

我有以下文件:

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) : a(_a), slotTimeU(_slotTimeU), slotTimeV(_slotTimeV) {}    

};

struct CICLO {
    set<ARCO_TEMPO> arco_tempo_order;
    set<int> arco_tempo_Aux;
    int aircraftType; 
    float COST;
    float reducedCost;
    float duracao;
    int numAircrafts;
    vector<bool> VisitedNodes; 
    vector<vector<bool>> VisitedVertices;
};
我尝试为Ciclos添加一个不同的循环:

CICLO[10] = { aircraft type: 2; arco_tempo_order:  (2,3)-(1, 2); (3,2)-(2, 3); (2,2)-(3, 4); (2,2)-(4, 5); (2,2)-(5, 6); (2,2)-(6, 7); (2,2)-(7, 1);  COST: 25000140 }
正如我们所看到的,CICLO[10]是一个新的CICLO,但它将CICLO[10]检测为冗余CICLO

在调试代码时,我验证了它将CICLO[10]的比较结果如下:

obj1  = { aircraft type: 2 (1,4)-(1, 2); (4,1)-(2, 3); (1,1)-(3, 4); (1,1)-(4, 5); (1,1)-(5, 6); (1,1)-(6, 7); (1,1)-(7, 1);  COST: 25000228 }
obj2  = { aircraft type: 2 (2,3)-(1, 2); (3,2)-(2, 3); (2,2)-(3, 4); (2,2)-(4, 5); (2,2)-(5, 6); (2,2)-(6, 7); (2,2)-(7, 1);  COST: 25000140 }
7
obj1  = { aircraft type: 2 (2,5)-(1, 2); (5,2)-(2, 3); (2,2)-(3, 4); (2,2)-(4, 5); (2,2)-(5, 6); (2,2)-(6, 7); (2,2)-(7, 1);  COST: 25000164 }
obj2  = { aircraft type: 2 (2,3)-(1, 2); (3,2)-(2, 3); (2,2)-(3, 4); (2,2)-(4, 5); (2,2)-(5, 6); (2,2)-(6, 7); (2,2)-(7, 1);  COST: 25000140 }
7
obj1  = { aircraft type: 2 (1,5)-(1, 2); (5,1)-(2, 3); (1,1)-(3, 4); (1,1)-(4, 5); (1,1)-(5, 6); (1,1)-(6, 7); (1,1)-(7, 1);  COST: 25000142 }
obj2  = { aircraft type: 2 (2,3)-(1, 2); (3,2)-(2, 3); (2,2)-(3, 4); (2,2)-(4, 5); (2,2)-(5, 6); (2,2)-(6, 7); (2,2)-(7, 1);  COST: 25000140 }
7
obj1  = { aircraft type: 2 (4,5)-(1, 2); (5,4)-(2, 3); (4,4)-(3, 4); (4,4)-(4, 5); (4,4)-(5, 6); (4,4)-(6, 7); (4,4)-(7, 1);  COST: 25000096 }
obj2  = { aircraft type: 2 (2,3)-(1, 2); (3,2)-(2, 3); (2,2)-(3, 4); (2,2)-(4, 5); (2,2)-(5, 6); (2,2)-(6, 7); (2,2)-(7, 1);  COST: 25000140 }
1
obj1  = { aircraft type: 2 (2,3)-(1, 2); (3,2)-(2, 3); (2,2)-(3, 4); (2,2)-(4, 5); (2,2)-(5, 6); (2,2)-(6, 7); (2,2)-(7, 1);  COST: 25000140 }
obj2  = { aircraft type: 2 (1,5)-(1, 2); (5,1)-(2, 3); (1,1)-(3, 4); (1,1)-(4, 5); (1,1)-(5, 6); (1,1)-(6, 7); (1,1)-(7, 1);  COST: 25000142 }
7
如果我尝试将运算符<功能替换为以下功能:

bool operator<(const CICLO& lhs, const CICLO& rhs) { return std::tie(lhs.COST, lhs.aircraftType, lhs.arco_tempo_order) < std::tie(rhs.COST, rhs.aircraftType, rhs.arco_tempo_order); }

有人知道为什么会这样吗

操作员必须具有“严格弱顺序”,才能正确使用STL

本声明:

if (obj1.COST < obj2.COST - 1) {
    return true;
}
if(obj1.COST
使条件不真实

obj1.COST = 9;
obj2.COST = 10;

obj1 < obj2      false
obj2 < obj1      false
obj1.COST=9;
obj2.COST=10;
obj1
这意味着这两个对象是相等的(所有其他事物都是相同的)

让我们将其扩展到三个对象

obj1.COST = 9;
obj2.COST = 10;
obj3.COST = 11;

obj1 < obj2      false
obj2 < obj1      false
// So obj1 == obj2


obj2 < obj3      false
obj3 < obj2      false
// So obj2 == obj3

// This we should be able to assume:
obj1 == obj3
// Otherwise strict weak ordering is not working.


obj1 < obj3      true
obj3 < obj1      false
// So they are not equal.
// Something is very wrong and thus your set is not going to work.
obj1.COST=9;
obj2.COST=10;
obj3.成本=11;
obj1

请查看此答案,以获取实现解决方案的简单方法。

欢迎使用堆栈溢出。你能给我们举一个两个ciclo的例子,操作员应该返回什么,以及它实际返回什么吗?简单地使用如下内容:
bool operator即使成本、飞机类型和arco_tempo_order.size()相同,我需要在arco_tempo_中验证每个arco_节奏,以得出两个ciclo是否相同的结论。所以,我不认为我只能用你说的,@Jarod42<代码>运算符<(const std::set&,const std::set&)
已定义。当我尝试为您的运算符替换我的运算符时,会多次生成相同的CICLO。我认为成本是一个浮动变量,我用大小值来计算成本,我需要在原始成本中添加一些小值。我认为,由于成本价值的微小差异,它将相同的CICLO视为不同的CICLO。我试图在rhs.COST中添加1,但随后出现了一条错误消息。问题是我正在使用较大的COST值。那么,我就不会有成本差为一个单位的CICLO了。我试着用@Jarod42!建议,但在thta的情况下,相同的CICLO被添加了很多时间。@LuizaReal基本上你需要以一致的方式定义小于。你的方法不一致。您需要考虑另一种方法(从rhs中减去1不起作用)。比较浮点值总是很棘手的(尝试并避免这种情况(即转换为整数)。谢谢,@MartinYork!我用double替换了float,这很有效。
CICLO[11499] = { aircraft type: 2 (3,2)-(3, 4); (2,1)-(4, 5); (1,5)-(5, 1); (5,5)-(1, 2); (5,5)-(2, 3); (5,5)-(3, 4); (5,3)-(4, 5); (3,3)-(5, 1); (3,3)-(1, 2); (3,3)-(2, 3);  COST: 46000392.0000000000 }
CICLOIT[11500] = { aircraft type: 2 (3,2)-(3, 4); (2,1)-(4, 5); (1,5)-(5, 1); (5,5)-(1, 2); (5,5)-(2, 3); (5,5)-(3, 4); (5,5)-(4, 5); (5,3)-(5, 1); (3,3)-(1, 2); (3,3)-(2, 3);  COST: 46000392.0000000000 }
if (obj1.COST < obj2.COST - 1) {
    return true;
}
obj1.COST = 9;
obj2.COST = 10;

obj1 < obj2      false
obj2 < obj1      false
obj1.COST = 9;
obj2.COST = 10;
obj3.COST = 11;

obj1 < obj2      false
obj2 < obj1      false
// So obj1 == obj2


obj2 < obj3      false
obj3 < obj2      false
// So obj2 == obj3

// This we should be able to assume:
obj1 == obj3
// Otherwise strict weak ordering is not working.


obj1 < obj3      true
obj3 < obj1      false
// So they are not equal.
// Something is very wrong and thus your set is not going to work.