Cравнение элементов в std::list>

Имеется std::list std::list<Point* > my_list, где Point - структура с двумя полями: int x, y

Необходимо проверить лист листов на совпадения элементов, т.е идентичность некоторых листов друг с другом и в итоге оставить уникальные листы. Изменять последовательность элементов в самих листах нельзя. Т.е,

Вход:

[ [(1,1),(2,1),(2,0)],
[(1,1),(2,1),(2,2)], [(1,1),(2,1),(2,0)] ]

Выход:

[ [(1,1),(2,1),(2,0)], [(1,1),(2,1),(2,2)] ]

Варант std::sort с последующим std::unique не подходит, так как критерий сортировки не ясен.

Сооружать "Франкенштейна" с помощью циклов не хочется. Можно ли как-то сделать это с помощью встроенных функций стандартной библиотеки?


Ответы (1 шт):

Автор решения: NunOfIt
#include <iostream>
#include <list>

class Point{
    int x, y, sq;
    
public:
    Point(int x, int y): x(x), y(y), sq(x*x + y*y) {}
    
    int get_x() const { return x; }
    int get_y() const { return y; }
    
    Point& operator=(const Point& other) {
        x = other.x;
        y = other.y;
        sq = other.sq;
        return *this;
    }
    
    bool operator<(const Point& other) const {
        return sq < other.sq;
    }
    
    bool operator==(const Point& other) const {
        return x == other.x && y == other.y;
    }
    
    friend std::ostream& operator<<(std::ostream&, const Point&);
};

std::ostream& operator<<(std::ostream& out, const Point& other) {
    out << "Point(";
    out << other.x << ", ";
    out << other.y << ")";
    return out;
}

int main() {
    std::list<Point> lst = {{1, 2}, {3, 4}, {5, 6}, {3, 4}, {1, 2}, {8, 9}, {1, 2}, {1, 2}, {1, 1}, {1, 1}};
    
    auto print = [&]() {
        for(Point& p: lst)
            std::cout << p << ' ';
        std::cout << '\n';
    };
    
    print();
    
    lst.sort();
    print();
    
    lst.unique();
    print();
    return 0;
}
→ Ссылка