Строить set для удаления дубликатов не хорошо, так как set гораздо медленнее вектора, и потребляет порядочно больше памяти. Для такой простой задачи гораздо лучше просто отсортировать вектор. Известно, что из отсортированной последовательности удалить дубликаты легко, причём за линейное время. Более того, в STL для этого уже есть готовая функция unique.
//для вектора
#include <vector>
//для sort и unique
#include <algorithm>
using namespace std;
struct Point
{
int x,y,z;
Point(int x=0,int y=0,int z=0):x(x),y(y),z(z){}
};
//оператор меньше для sort
bool operator<(const Point& a, const Point& b)
{
return a.x<b.x || a.x==b.x && (a.y<b.y || a.y==b.y && a.z<b.z);
}
//оператор проверки на равенство для unique
bool operator==(const Point& a, const Point& b)
{
return a.x==b.x && a.y==b.y && a.z==b.z;
}
...
vector<Point> p;
...//как-то заполняем p
//сортируем
sort(p.begin(),p.end());
//и удаляем дубликаты
p.resize(unique(p.begin(),p.end())-p.begin());
//всё, теперь p содержит только уникальные точки