如何重载std:swp()

如何重载std:swp()

std::swap()由许多std容器使用(如std::liststd::vector)在排序甚至分配过程中。

但性病的实施swap()对于自定义类型来说是非常普遍的和相当低效的。

因此,过载可以提高效率。std::swap()具有特定于自定义类型的实现。但是如何实现它,以便STD容器能够使用它呢?


www说
浏览 304回答 3
3回答

慕工程0101907

重载交换的正确方法是将它写入与您要交换的名称空间相同的名称空间,以便通过依赖于参数的查找(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);         // ...     }};

FFIVE

您不允许(根据C+标准)重载std:swp,但是特别允许您将针对您自己类型的模板专门化添加到std命名空间中。例如:namespace&nbsp;std{ &nbsp;&nbsp;&nbsp;&nbsp;template<> &nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;swap(my_type&&nbsp;lhs,&nbsp;my_type&&nbsp;rhs) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;...&nbsp;blah &nbsp;&nbsp;&nbsp;&nbsp;}}然后,STD容器(以及其他任何地方)中的用法将选择您的专门化,而不是一般的专门化。还请注意,对于派生类型来说,提供交换的基类实现还不够好。如果你有class&nbsp;Base{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;...&nbsp;stuff&nbsp;...}class&nbsp;Derived&nbsp;:&nbsp;public&nbsp;Base{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;...&nbsp;stuff&nbsp;...}namespace&nbsp;std{ &nbsp;&nbsp;&nbsp;&nbsp;template<> &nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;swap(Base&&nbsp;lha,&nbsp;Base&&nbsp;rhs) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;... &nbsp;&nbsp;&nbsp;&nbsp;}}这将适用于基类,但是如果您尝试交换两个派生对象,它将使用STD的通用版本,因为模板交换是完全匹配的(它避免了只交换派生对象的“基本”部分的问题)。注意:我更新了这个选项,以从我的最后一个答案中删除错误的部分。噢!(谢谢puetzk和j_RANDANK_HARKK指出这一点)
打开App,查看更多内容
随时随地看视频慕课网APP