станд :: Карта :: найти () - PullRequest
       18

станд :: Карта :: найти ()

0 голосов
/ 22 июня 2010

У меня есть простая структура, которую я использую в качестве ключа в 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), я бы хотел найти внутри карты первый PpointKey, который удовлетворяет условию внутри оператора == function

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

Возможно ли это с помощью find?Я получаю map.end (), поэтому я хотел бы проверить, использует ли функция find () оператор ==.Может быть, алгоритм поиска будет лучше?

Заранее спасибо.

1 Ответ

1 голос
/ 22 июня 2010

Функция find map не использует operator==.

Однако вы можете использовать std::find, передавая begin() и end() итератор map.Он будет просто перебирать последовательность по одному и давать первый соответствующий объект (сложность линейная).

Проблема, с которой вы столкнулись, связана с тем, что вы злоупотребили перегрузкой оператора.Проблема в том, что общее определение operator== таково:

T operator==(T lhs, T rhs)
{
  return !(lhs < rhs) && !(rhs < lhs);
}

И это не относится к вашему определению, поэтому вы не можете заменить одно на другое.

Это будетбыло бы лучше, если бы вы использовали традиционные функции с выразительными именами, а не перегрузкой операторов, это было бы менее вводящим в заблуждение.Обратите внимание, что map и std::find позволяют передавать подходящие объекты предикатов, вам не нужно перегружать операторы, чтобы использовать их.

...