C++ 从非基元类型的向量中删除重复元素

C++ 从非基元类型的向量中删除重复元素,c++,vector,duplicates,element,C++,Vector,Duplicates,Element,我读取了大量的点坐标x、y和z,并将它们存储在点结构的向量中以进行进一步处理 struct Point{ double x,y,z; Point (double x0, double y0, double z0): x(x0), y(y0), z(z0) {} } vector<Point> pv; pv.push_back (Point(x,y,z)); 结构点{ 双x,y,z; 点(双x0,双y0,双z0):x(x0),y(y0),z(z0){} } 向量p

我读取了大量的点坐标x、y和z,并将它们存储在点结构的向量中以进行进一步处理

struct Point{
    double x,y,z;
    Point (double x0, double y0, double z0): x(x0), y(y0), z(z0) {}
}


vector<Point> pv;
pv.push_back (Point(x,y,z));
结构点{
双x,y,z;
点(双x0,双y0,双z0):x(x0),y(y0),z(z0){}
}
向量pv;
pv.push_back(点(x,y,z));
我还有一个散列函数,它将具有相同坐标的所有点及其向量索引映射到一个无序的_多重映射,以便进行其他处理

struct Point{
    double x,y,z;
    Point (double x0, double y0, double z0): x(x0), y(y0), z(z0) {}
}


vector<Point> pv;
pv.push_back (Point(x,y,z));

问题是我从文件中读取了许多重复点,我必须去除这些元素。我已经看到了如何从基元类型的向量中删除重复元素的解决方案,但这不适用于我的情况。除此之外,许多建议的方法都需要不适用于点结构的排序。

定义less运算符,然后应用与基元类型相同的方法

如何定义运算符是:

struct Point{
    (...)
    const bool operator < ( const Point &r ) const{
        return (x<r.x) || (x==r.x && y<r.y) || (x==r.x && y==r.y && z<r.z);
    }
};
结构点{
(...)
常量布尔运算符<(常量点和r)常量{
返回(x您可以使用所谓的:


std::remove_if?在您的问题的上下文中,说一个点小于或大于另一个点没有意义。但是,您仍然可以在点上引入总排序,这将使您能够使用需要排序的方法(例如std::unique)。例如,您可以先按x坐标排序。如果两个点的x坐标相等,则按y坐标排序。如果它们的y坐标相等,则按z坐标排序。如果z坐标相等,则各点相等。根据获取值的方式,使用双精度可能会引起问题。或者OP可以为他的类专门化
std::less
。或者更惯用的
返回std::tie(x,y,z)
bool operator==(Point a, Point b) {
    return a.x == b.x && a.y == b.y && a.z == b.z;
}