首页 > 新闻中心 > 技术百科

C 中如何定义合适的swap函数,matlab如何定义一个函数 返回列表

网络2023-08-27 00:00:00编辑发布,已经有个小可爱看过这篇文章啦

在std命名空间中标准库以模板函数的方式实现了swap算法:

? ? namespace std{

? ? template

? ? void swap(T&a,T&b)

? ? {

? ? ? ? T temp(a);

? ? ? ? a=b;

? ? ? ? b=temp;

? ? }

}

首先,如果swap的缺省实现码的效率可以接受,不需要做任何额外的事情;

其次,如果缺省实现的效率不足,应该按如下方法实现swap函数功能

1、提供一个public swap成员函数,让它高效的置换类型的两个对象值;(此函数不应该抛出异常)

2、在class或者template所在的命名空间内提供一个non-member swap,并另它调用上述swap成员函数

3、如果真在编写一个class(非class template),为所定义的class特化std::swap,并另它调用swap成员函数(为了让非正确的调用方式std::swap(obj1,obj2)也能准确匹配正确的swap函数)

4、在需要调用swap函数的地方包含using std::swap让其可见,然后再调用

? ? using std::swap;

? ? swap(obj1,obj2)

? ?根据C++函数匹配规则(primer C++ p616)如果一个非模板函数与一个模板函数提供同样好的匹配,则选择非模板版本;如果有多个重载模板对一个调用提供同样好的匹配,则选择最特例化的版本

?

编译器匹配swap函数的过程如下图所示

?

?

?

综上所述,对于定义class的swap函数,如下

? namespace WidgetStuff{

? class Widget{

? ? public:

? ? ………

? ? void swap(Widget& other)

? ? ? ? {

? ? ? ? using std::swap;

? ? ? ? swap(pImpl,other.pImpl);

? ? ? ? }

? ? …..

? ? };

? ? void swap(Widget&a,Widget&b)

? ? ? ? {

? ? ? ? a.swap(b);

? ? ? ? }

}

namespace std{

? ? template

? ? void swap(Widget&a,Widget&b)

? ? {

? ? a.swap(b)

? ? }

}

?

对于 template class应该按如下

《C 中如何定义合适的swap函数,matlab如何定义一个函数》来自互联网同行内容,若有侵权,请联系我们删除!

  • 互联网
  • 也能
  • 多个
  • 要做
  • 让它
  • 实现了
  • aliyucs
  • gz
  • 如下图
  • 抛出

热门新闻

来电咨询