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;
}