从非原始类型的向量中删除重复元素
removing duplicate elemnts from a vector of non-primitive type
我读取了非常多的点坐标x、y和z,并将它们存储在Point结构的向量中以做进一步处理。
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));
我还有一个哈希函数,可以将具有相同坐标的所有点连同它们的向量索引一起映射到 unordered_multimap 以进行其他处理。
问题是我从文件中读取了很多重复点,我必须删除这些元素。我已经看到有关如何从原始类型向量中删除重复元素的解决方案,但这不适用于我的情况。此外,许多建议的方法需要不适用于点结构的排序。
定义 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);
}
};
你可以使用所谓的erase-remove "idiom":
#include <algorithm>
...
pv.erase(std::remove(pv.begin(), pv.end(), pointToRemove), pv.end());
其中 operator==
已为 Point
定义:
bool operator==(Point a, Point b) {
return a.x == b.x && a.y == b.y && a.z == b.z;
}
我读取了非常多的点坐标x、y和z,并将它们存储在Point结构的向量中以做进一步处理。
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));
我还有一个哈希函数,可以将具有相同坐标的所有点连同它们的向量索引一起映射到 unordered_multimap 以进行其他处理。
问题是我从文件中读取了很多重复点,我必须删除这些元素。我已经看到有关如何从原始类型向量中删除重复元素的解决方案,但这不适用于我的情况。此外,许多建议的方法需要不适用于点结构的排序。
定义 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);
}
};
你可以使用所谓的erase-remove "idiom":
#include <algorithm>
...
pv.erase(std::remove(pv.begin(), pv.end(), pointToRemove), pv.end());
其中 operator==
已为 Point
定义:
bool operator==(Point a, Point b) {
return a.x == b.x && a.y == b.y && a.z == b.z;
}