删除重复的项目而不进行舍入,C ++

时间:2011-03-16 18:46:32

标签: c++ duplicates comparator

我正在尝试使用以下比较器从矢量中删除重复的项目

            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

操作员==没有带来任何影响,近点没有彼此相邻排序......

是否有可能在没有舍入的情况下删除这些双重点(例如,扩散网比较器)?我知道,坐标有很多小数位......

4 个答案:

答案 0 :(得分:1)

std :: sort需要运算符&lt;,而不是运算符==

答案 1 :(得分:0)

  

操作员==没有带来任何影响,近点没有彼此相邻排序......

如果xy的类型为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项中进行了审查。

http://drdobbs.com/184401469#1

答案 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扔到任何地方都会导致 关系秩序不再严格,并将导致 排序算法中的未定义行为。)