性病::地图::找到()

时间:2010-06-22 06:58:12

标签: c++ map find operator-overloading

我有一个简单的结构,我将其用作std :: map

中的键
struct PpointKey{
        unsigned int xp,yp; //pixel coordinates

        unsigned int side;

        PpointKey(unsigned xp,unsigned yp,unsigned side=5):xp(xp),yp(yp),side(side)
        {}  


        bool operator==(const PpointKey& other) const{
                const unsigned int x = other.xp;
                const unsigned int y = other.yp;

                return ((x>=xp && x<=xp+side) && (y>=yp && y<=yp+side));
        }   

        bool operator<(const PpointKey& other) const{

                const unsigned int x = other.xp;
                const unsigned int y = other.yp;

                const unsigned  other_distance_2 = x*x + y*y;

                const unsigned  this_distance_2 = this->xp*this->xp + this->yp * this->yp;

                return this_distance_2 < other_distance_2;
        }   
};

我想要实现的是使用find()来访问具有xp,yp属性在side距离内的键的地图。换句话说,如果我有一个(x,y)元组,我想在map中找到第一个满足operator == function

内部条件的PpointKey
return ((x>=xp && x<=xp+side) && (y>=yp && y<=yp+side));

这可以使用find吗?我得到map.end(),所以我想检查一下find()函数使用operator ==。也许搜索算法会更好?

提前致谢。

1 个答案:

答案 0 :(得分:1)

find的{​​{1}}功能不使用map

但是,您可以使用operator==,传递std::find的{​​{1}}和begin()迭代器。它将简单地一次迭代一个序列,并产生匹配的第一个对象(复杂性是线性的)。

您遇到的问题是由于您滥用了操作员过载这一事实。这里的问题是end()的通用定义是:

map

这与你的定义不同,因此你不能用一个代替另一个。

如果您使用具有表达名称的传统函数而不是运算符重载,那将是最好的,它会减少误解。请注意,operator==T operator==(T lhs, T rhs) { return !(lhs < rhs) && !(rhs < lhs); } 允许您传递合适的谓词对象,您无需重载运算符即可使用它们。