используя std :: set find со структурными данными

typedef struct Edge
{
int v1, v2, w;
bool operator <(const Edge &rhs) const{
bool b = v1 < rhs.v1 || v2 < rhs.v2;
return (b);
}
} edge;template <class T>
struct my_less
{
bool operator()(const T& _Left, const T& _Right) const
{
return (_Left < _Right);
}
};

int main(int argc, char *argv[])
{
set <edge, my_less<edge> > F;

edge e3 = { 3, 3, 3};
edge e4 = { 3, 7, 3};
edge e5 = { 2, 7, 3};

F.insert(e3);
printf("e3 ? %d\n", F.find(e3)!=F.end()); // O
printf("e4 ? %d\n", F.find(e4)!=F.end()); // O
printf("e5 ? %d\n", F.find(e5)!=F.end()); // X

//printf("%d\n", e3<e4);

return 0;
}
Если запустить этот код, я получил сообщение об ошибке «F.find (e5)! = F.end ()» со следующим сообщением.
«Ошибка отладки! Выражение: недопустимый оператор лт
Условие равенства двух ребер равенства ((x, y), (p, q))
# 33 (х lt p || Y lt q)  # 33 (стр lt x || Q вот так)

Это может быть '(xgt = p  МГТ = д)  (PGT = х  qgt = у)»

Я действительно не знаю, почему выдвинуто утверждение.
Что-то не так?

3

Решение

Ваше сравнение не навязывает строгий порядок. Например:

Edge e1;
Edge e2;

e1.v1 = 5;
e1.v2 = 4;

e2.v1 = 4;
e2.v2 = 5;

// e1 < e2 is true
// e2 < e1 is true
// So which one should we really trust? Neither, let's abort the program!

Вы должны сделать свой < оператор на самом деле работает как < должен. Если e1 < e2 верно, то e2 < e1 должен быть ложным.

я считать это может быть то, что вы хотите, но учтите, что я не проверял это:

return v1 < rhs.v1 || (v1 == rhs.v1 && v2 < rhs.v2);

это должен, в теории, сортировать по v1и использовать v2 разорвать связи.

7

Другие решения

Других решений пока нет …