Если об этом уже спрашивали, пожалуйста, прости меня, я не смог найти его.
У меня есть пользовательский тип, для которого я могу реализовать (нечеткое) равенство, но нет оператора <
, который является транзитивным.
Сравнение стоит дорого, но у меня не так много элементов.
Мне нужно разобрать многоугольники, которые почти одинаковы (они перекрываются с большой долей). Поскольку упорядочение с использованием <
невозможно из-за отсутствия транзитивной реализации, я использую std :: list, как показано ниже:
typedef std::list<Polygon> PolyList;
PolyList purged(rawList);
for (PolyList::iterator iter= purged.begin(); iter!= purged.end(); ++iter) {
for(PolyList::iterator toRemove = find(boost::next(iter),purged.end(),*iter); toRemove != purged.end(); ){
PolyList::iterator next = purged.erase(toRemove);
toRemove = find(next,purged.end(),*iter);
}
}
Сложность n * n / 2, что, на мой взгляд, неизбежно и
Хотя алгоритм работает нормально, его все равно очень трудно читать и писать, и я почти уверен, что для него есть стандартный алгоритм, который я просто не знаю или, по крайней мере, что-то более быстрое, но более точное для ввода. Как я уже сказал, сортировка не возможна из-за нечеткости данных, поэтому нет уникального набора или сортировки.
Большое спасибо заранее за помощь мне