swap函数

swap函数

中文名 swap函数
所属语言 C语言
原因 c++标准库函数里面的swap函数冲突
目录导航

问题产生

#include <iostream>

using namespace std;

int main()

{

 

 void swap(int &,int &);

 int i=3,j=5;

 swap(i,j);

 cout<<"i="<<i<<" "<<"j="<<j<<endl;

 return 0;

}

void swap(int &a,int &b)

{int temp;

 temp=a;

 a=b;

 b=temp;

}

vc6.0下,输出的是:

i=3,j=5

交换不了。

解决方案

 

1.改函数名:

#include <iostream>

using namespace std;

int main()

{

 

 void swapa(int &,int &);

 int i=3,j=5;

 swapa(i,j);

 cout<<"i="<<i<<" "<<"j="<<j<<endl;

 return 0;

}

void swapa(int &a,int &b)

{int temp;

 temp=a;

 a=b;

 b=temp;

}

2.不用标准库,

#include <iostream.h>

int main()

{

 

 void swap(int &,int &);

 int i=3,j=5;

 swap(i,j);

 cout<<"i="<<i<<" "<<"j="<<j<<endl;

 return 0;

}

void swap(int &a,int &b)

{int temp;

 temp=a;

 a=b;

 b=temp;

}

3.不用命名空间

#include <iostream>

int main()

{

 

 void swap(int &,int &);

 int i=3,j=5;

 swap(i,j);

 std::cout<<"i="<<i<<" "<<"j="<<j<<std::endl;

 return 0;

}

void swap(int &a,int &b)

{int temp;

 temp=a;

 a=b;

 b=temp;

}

4.直接调用:

#include <iostream>

using namespace std;

int main()

{

 

 int i=3,j=5;

 swap(i,j);

 cout<<"i="<<i<<" "<<"j="<<j<<endl;

 return 0;

}

5.去掉函数声明。

#include<iostream>

using namespace std;

void swap(int &a,int &b)

{

 int temp=a;

 a=b;

 b=temp;

}

int main()

{

 int a=11,b=5;

 swap(a,b);

 cout<<a<<" "<<b<<endl;

 return 0;

}

问题原因

 

出现上面问题,关键是跟c++标准库函数里面的swap函数冲突了。

就是存在std::swap

标准库的swap函数,跟上面自定义的swap函数(形参,返回值)一模一样的。因此编译器就出现问题了。

单步调试的结果是,翻译器跳过上面的 swap(i,j)语句。

通过单步调试第四个程序,找到std::swap的原型:

template<class _Ty> inline

 void swap(_Ty& _X, _Ty& _Y)

{_Ty _Tmp = _X;

 _X = _Y, _Y = _Tmp; }

启示

 

不要直接用using namespace std;

这种方法,要用到的时候,才用std:: 这样。

例如,std::endl;等等。

避免出现上面问题。

swap函数作用 

交换两个 concurrent_vector 对象的元素。

语法

 template<

   typename _Ty,

   class _Ax

>

inline void swap(

   concurrent_vector<_Ty,

   _Ax> &_A,

   concurrent_vector<_Ty,

   _Ax> &_B

);

参数

 template<

   typename _Ty,

   class _Ax

>

inline void swap(

   concurrent_vector<_Ty,

   _Ax> &_A,

   concurrent_vector<_Ty,

   _Ax> &_B

);

备注

_Ty

要存储在并发向量中的元素的数据类型。

_Ax

并发向量的分配器类型。

_A

其元素将要与并发向量 _B 的元素交换的并发向量。

_B

提供要交换的元素的并发向量,或其元素将要与并发向量 _A 的元素交换的向量。

要求

模板函数是执行成员函数 _A.concurrent_vector::swap(_B) 的 concurrent_vector 容器类上的专用算法。 这些是通过编译器函数模板部分排序的实例。 如果模板函数以模板与函数调用的匹配不唯一的方式重载时,则编译器将选择模板函数最专用的版本。 模板函数 template <class T> void swap(T&, T&) 的常见形式,在算法类中通过赋值来工作,是较慢的操作。 每个容器中专门的版本与用于容器类内部表示相比要快得多。

此方法不是并发安全方法。 在调用该方法时,必须确保在任一并发矢量上没有其他线程在执行操作。

相关百科
返回顶部
产品求购 求购