c++ - vector 排序 : swap overload

标签 c++ sorting overloading swap

我想为原始类型/对象的 std::vector 重载交换函数。原因是使用 std::sort 对包含大对象的 vector 进行缓慢排序。这是一个简单但不起作用的示例。

#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 重载方法没有被调用。我想包含对象的 vector 也会有类似的情况……谢谢你的帮助……

最佳答案

实现交换的正确方法是:

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);
    }
}

但是,只有当您需要编写三巨头(您是 managing some resource )时才有意义。

你不是,所以我不明白这一点。 (所有你的 swap 都会做的就是复制一些 double ,就像默认的 std::swap 一样。)

关于c++ - vector 排序 : swap overload,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3704868/

上一篇:C++ 指针问题

下一篇:C++重新定义一个类

相关文章:

c++ - 如何启动具有不同静态值的同一应用程序的两个实例?

java - Java 中的新功能 Lambda 重载

r - 在方面着色ggplot x轴

scala - 为什么是 "avoid method overloading"?

oop - 多态性、重载和覆盖是相似的概念吗?

c++ - 交换指针

c++ - 如果仅使用模板,则启用模板功能

c++ - LNK2001 在 VS 2013 (MSVC 18) 但不是在 VS 2015 (MSVC 19)

C++:如何比较几个 vector ,然后创建一个包含所有 vector 的所有元素的新排序 vector

javascript - 根据另一个属性仅对数组中的一个属性进行排序