所以在我的代码中我得到了一个多维数组的向量。在该向量中,我存储轮廓点的坐标。在我恢复轮廓之前,基于这些点,我必须擦除重复数据以减少数据。所以如果向量被排序,我发现我可以使用std::unique
。但是不需要排序,所以我想从未排序的向量中删除重复项。所以我必须使用std::set
删除重复项
std::vector<std::array<double, 3>> matrix;
rows = 2*lss.size();
matrix.resize(rows);
int j=0;
for(size_t i = 0;i<lss.size();i++) {
int k = j+1;
matrix[j][0]=lss[i].v[0].x;
matrix[j][1]=lss[i].v[0].y;
matrix[j][2]=lss[i].v[0].z;
matrix[k][0]=lss[i].v[1].x;
matrix[k][1]=lss[i].v[1].y;
matrix[k][2]=lss[i].v[1].z;
j=j+2;
}
std::set<double> set(matrix.begin(), matrix.end());
matrix.erase(std::remove_if(matrix.begin(), matrix.end(), [&set] (double item) {return !set.erase(item); }), matrix.end());
但对于行std::set<double> set(matrix.begin(), matrix.end());
,我收到以下错误消息:'std::pair<_Ty1,_Ty2> std::set<_Kty>::insert(double &&) : cannot convert parameter 1 from std::array<_Ty,_Size> to 'double &&'
。
对于以下行,我还会收到一条错误消息:'bool export::<lambda_c894aac2078f37151750793b2c6d0417>::operator ()(double) const' : cannot convert parameter 1 from 'std::array<_Ty,_Size>' to 'double'
答案 0 :(得分:1)
如果您要求您的容器仅包含唯一商品,并且您不关心这些商品的排序,那么您始终只需使用std::unordered_set来保存您的坐标。
简单示例:
#include <iostream>
#include <unordered_set>
struct Point
{
double x, y, z;
bool operator==(const Point& other) const
{
return (x == other.x) && (y == other.y) && (z == other.z);
}
};
从此answer获取的哈希函数:
struct Hash
{
size_t operator() (const Point &point) const
{
return ((std::hash<double>()(point.x)
^ (std::hash<double>()(point.y) << 1)) >> 1)
^ (std::hash<double>()(point.z) << 1);
}
};
int main()
{
std::unordered_set<Point, Hash> uset;
uset.insert({ 100, 100, 200 });
uset.insert({ 100, 100, 200 });
uset.insert({ 100, 100, 200 });
std::cout << uset.size() << '\n'; // prints 1
return 0;
}
答案 1 :(得分:0)
您应该更改
行std::set<double> set(matrix.begin(), matrix.end());
为:
std::set<std::array<double, 3>> set(matrix.begin(), matrix.end());
你正在构建一组矩阵,而不是双打。您的集合的模板参数应与您的矢量相同。