我正在尝试使用以下比较器从矢量中删除重复的项目
bool operator() ( const Point * p1, const Point * p2 ) const
{
return ( p1->X() < p2->X() ) || ( ( p1->X() == p2->X() ) && ( p1->Y() < p2-Y() ) );
}
并重载了opeartor ==
bool Point::operator == ( const Point &p ) const
{
return ( x - p.x ) * ( x - p.x ) + ( y - p.y ) * ( y - p.y ) < DIFF;
}
原理图删除:
std::sort ( it_begin, it_end, Comp );
Points::iterator i_new_end = std::unique ( it_begin, it_end, Uniq);
items.erase ( i_new_end, this->items.end() );
然而,数据存在问题。根据x坐标分类的点
-0.0000000015 -6281103.8487118632 0.0000000000
-0.0000000011 -5993359.5353725236 0.0000000000
-0.0000000010 -5523510.0253371494 0.0000000000
-0.0000000009 -4885831.4582128422 0.0000000000
-0.0000000009 -4099699.3745807474 0.0000000000
-0.0000000008 -3189000.0000000000 0.0000000000
-0.0000000008 -2181404.4741311157 0.0000000000
-0.0000000008 -1107528.0771596823 0.0000000000 //unique
-0.0000000008 -0.0000000005 0.0000000000
-0.0000000007 1107528.0771596811 0.0000000000 //unique
-0.0000000007 2181404.4741311143 0.0000000000
-0.0000000007 3188999.9999999991 0.0000000000
-0.0000000006 4099699.3745807474 0.0000000000
-0.0000000006 4885831.4582128404 0.0000000000
-0.0000000005 5523510.0253371485 0.0000000000
-0.0000000004 5993359.5353725236 0.0000000000
0.0000000000 -6281103.8487118632 0.0000000000
0.0000000004 5993359.5353725236 0.0000000000
0.0000000005 5523510.0253371485 0.0000000000
0.0000000006 4099699.3745807474 0.0000000000
0.0000000006 4885831.4582128404 0.0000000000
0.0000000007 1107528.0771596811 0.0000000000
0.0000000007 2181404.4741311143 0.0000000000
0.0000000007 3188999.9999999991 0.0000000000
0.0000000008 -3189000.0000000000 0.0000000000
0.0000000008 -2181404.4741311157 0.0000000000
0.0000000008 -1107528.0771596823 0.0000000000
0.0000000008 -0.0000000005 0.0000000000
0.0000000009 -4885831.4582128422 0.0000000000
0.0000000009 -4099699.3745807474 0.0000000000
0.0000000010 -5523510.0253371494 0.0000000000
0.0000000011 -5993359.5353725236 0.0000000000
0.0000000015 -6281103.8487118632 0.0000000000
0.0089638987 -6377999.9999999991 0.0000000000
操作员==没有带来任何影响,近点没有彼此相邻排序......
是否有可能在没有舍入的情况下删除这些双重点(例如,扩散网比较器)?我知道,坐标有很多小数位......
答案 0 :(得分:1)
std :: sort需要运算符&lt;,而不是运算符==
答案 1 :(得分:0)
操作员==没有带来任何影响,近点没有彼此相邻排序......
如果x
和y
的类型为float或double,则无法可靠地执行相等操作。
在比较时考虑使用numeric_limits<double>::epsilon()
或numeric_limits<float>::epsilon()
!
您的实施中的DIFF
是否等于numeric_limits<T>::epsilon()
? (其中T是数据类型:float或double)
答案 2 :(得分:0)
std::sort
使用operator<
。 std::unique
使用operator==
。
在STL中,由operator==
定义的等同和使用operator<
定义的等价之间存在区别:
如果两个对象都不相同 以某种排序顺序排在另一个之前 出于兴趣。通常,等值 是平等的,但并非总是如此。对于 例如,字符串“STL”和“stl” 在不区分大小写的情况下是等效的 排序,但他们当然不是 等于。有关区别的详细信息 在等同和平等之间, 请参考有关STL的任何好的参考资料。 在Effective STL中,问题是 在第19项中进行了审查。
答案 3 :(得分:0)
我认为你遇到了无法解决的问题。标准 sort算法需要一个定义的排序运算符 严格的订购。并且没有办法实现它 “模糊”的关系。你最好的选择是定义你的 与你的==相同的关系,但没有 小量:
inline double mag2( Point const& p )
{
return p.X() * p.X() + p.Y() * p.Y();
}
bool operator()( Point const* lhs, Point const* rhs )
{
return mag2( *lhs ) < mag2( *rhs );
}
(将epsilon扔到任何地方都会导致 关系秩序不再严格,并将导致 排序算法中的未定义行为。)