В задаче программирования я стараюсь обеспечить, чтобы определенный вектор содержал только уникальные элементы. С примитивными типами операция так же проста, как:
vector<int> lala;
lala.push_back(1);
lala.push_back(99);
lala.push_back(3);
lala.push_back(99);
sort(lala.begin(), lala.end()); // lala: 1, 3, 99, 99
lala.erase(unique(lala.begin(), lala.end()), lala.end()); // lala: 1, 3, 99
Однако проблема в том, что я не использую int. Но:
typedef struct
{
int x;
int y;
int maxX;
int maxY;
int width;
int height;
int id;
} Rect;
bool SameRect(Rect first, Rect second)
{
return first.x == second.x &&
first.y == second.y &&
first.width == second.width &&
first.height == second.height &&
first.maxX == second.maxX &&
first.maxY == second.maxY;
}
//...
vector<Rect> lala;
//...
sort(lala.begin(), lala.end());
lala.erase(unique(lala.begin(), lala.end(), SameRect), lala.end());
//...
На самом деле не работает. Что я сделал не так?
EDIT:
По совету sth я реализовал два предиката сортировки для std :: sort ():
bool SortRect(const Rect &first, const Rect &second)
{
if (first.x < second.x) return true;
if (first.x > second.x) return false;
if (first.y < second.y) return true;
if (first.y > second.y) return false;
if (first.maxX < second.maxX) return true;
if (first.maxX > second.maxX) return false;
if (first.maxY < second.maxY) return true;
if (first.maxY > second.maxY) return false;
if (first.width < second.width) return true;
if (first.width > second.width) return false;
if (first.height < second.height) return true;
if (first.height > second.height) return false;
if (first.id < second.id) return true;
if (first.id > second.id) return false;
return false;
}
Но я обнаружил, что он имеет такой же эффект, как:
bool SortRect(const Rect &first, const Rect &second)
{
return first.x < second.x;
}
если документация SGI может быть найдена. Более короткий и простой предикат сортировки также должен работать. Мой тест подтвердил это (хотя я не пробовал все возможные комбинации).