为了账号安全,请及时绑定邮箱和手机立即绑定

如何重载std:swp()

如何重载std:swp()

C++
桃花长相依 2019-08-03 07:03:42
如何重载std:swp()std::swap()由许多std容器使用(如std::list和std::vector)在排序甚至分配过程中。但性病的实施swap()对于自定义类型来说是非常普遍的和相当低效的。因此,过载可以提高效率。std::swap()具有特定于自定义类型的实现。但是如何实现它,以便STD容器能够使用它呢?
查看完整描述

3 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

重载交换的正确方法是将它写入与您要交换的名称空间相同的名称空间,以便通过依赖于参数的查找(Adl)..一件特别容易做的事情是:

class X{
    // ...
    friend void swap(X& a, X& b)
    {
        using std::swap; // bring in swap for built-in types

        swap(a.base1, b.base1);
        swap(a.base2, b.base2);
        // ...
        swap(a.member1, b.member1);
        swap(a.member2, b.member2);
        // ...
    }};




查看完整回答
反对 回复 2019-08-05
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

您不允许(根据C+标准)重载std:swp,但是特别允许您将针对您自己类型的模板专门化添加到std命名空间中。例如:

namespace std{
    template<>
    void swap(my_type& lhs, my_type& rhs)
    {
       // ... blah
    }}

然后,STD容器(以及其他任何地方)中的用法将选择您的专门化,而不是一般的专门化。

还请注意,对于派生类型来说,提供交换的基类实现还不够好。如果你有

class Base{
    // ... stuff ...}class Derived : public Base{
    // ... stuff ...}namespace std{
    template<>
    void swap(Base& lha, Base& rhs)
    {
       // ...
    }}

这将适用于基类,但是如果您尝试交换两个派生对象,它将使用STD的通用版本,因为模板交换是完全匹配的(它避免了只交换派生对象的“基本”部分的问题)。

注意:我更新了这个选项,以从我的最后一个答案中删除错误的部分。噢!(谢谢puetzk和j_RANDANK_HARKK指出这一点)




查看完整回答
反对 回复 2019-08-05
  • 3 回答
  • 0 关注
  • 433 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信