Векторная сортировка: перегрузка свопа - PullRequest
1 голос
/ 14 сентября 2010

Я бы хотел перегрузить функцию подкачки для std :: vector примитивных типов / объектов. Причина в медленной сортировке векторов, содержащих большие объекты, с использованием std :: sort. Вот простой, но не рабочий пример.

#include <vector>
#include <algorithm>
class Point
{
private:
    double x, y;
public:
    Point(double xx, double yy) : x(xx), y(yy) {}

    bool operator < ( const Point& p ) const
    {
        return x < p.x;
    }

    void swap(Point &p)
    {
        std::swap(*this, p);
    }

};

namespace std
{
void swap( Point &p1, Point &p2)
{
    p1.swap(p2);
}
}

typedef  std::vector<Point> TPoints;
int main()
{
Point p1(0,0);
Point p2(7,100);

TPoints points;
points.push_back(p1);
points.push_back(p2);

    //Overloaded metod swap will not be called
std::sort(points.begin(), points.end());
}

К сожалению, во время загрузки перегруженного метода std :: sort не вызывается. Я полагаю, что вектор, содержащий объекты, будет похожей ситуацией ... Спасибо за помощь ...

Ответы [ 3 ]

5 голосов
/ 14 сентября 2010

Правильный способ реализации подкачки:

class foo
{
public:
    void swap(foo& pOther)
    {
        using std::swap; // enable ADL
        swap(member1, pOther.member1); // for all members
    }
};

// allows swap to be found with ADL (place in same namespace as foo)
void swap(foo& pFirst, foo& pSecond)
{
    pFirst.swap(pSecond);
}

// allows swap to be found within std
namespace std
{
    // only specializations are allowed to
    // be injected into the namespace std
    template <>
    void swap(foo& pFirst, foo& pSecond)
    {
        pFirst.swap(pSecond);
    }
}

Однако это имеет смысл делать только тогда, когда вам нужно написать «большую тройку» (вы управляете каким-то ресурсом ).

Нет, поэтому я не вижу смысла.(Все, что вам нужно сделать swap, это скопировать несколько удвоений, как это делал бы по умолчанию std::swap.)

1 голос
/ 14 сентября 2010

Вы должны специализировать шаблон std::swap, не перегружая его.

ПРИМЕР:

namespace std
{
    template<>
    void swap<Point>( Point &p1, Point &p2)
    {
        p1.swap(p2);
    }
}
0 голосов
/ 14 сентября 2010

sort, вероятно, вызывает функцию-член swap вектора. В любом случае вы не можете делать то, что делаете, переопределение std :: swap приведет к хаосу.

Плюс - вы уверены, что двойной, двойной считается большим?

...