SWAP函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SWAP函数相关的知识,希望对你有一定的参考价值。

我用java写得快排,swap(i,j)结果就没交换(swap(R[I],R[J])
但是swap(R,i,J)就好了,结果就是对的,万分不明白,不都是交换值吗。威慑么?????

swap函数,作用是交换两个元素的值,以STL的源代码为例:
template <class T> void swap ( T& a, T& b )

T c(a); a=b; b=c;


代码很简单,推荐使用STL
algorithm中的swap函数而不要自己写swap函数,因为STL的swap函数有很强的通用性,它基本可以交换任意类型的元素(包括vector,list……)。

看一个例题:给两个数组,交换这两个数组的元素,并打印:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
void myprint(int
&num)cout<<num<<"
";
int main()


vector
<int> A,B;
int
n,m;

cin>>n;
for(int
i=0;i<n;i++)


int t;
cin>>t;

A.push_back(t);


cin>>m;
for(int
i=0;i<m;i++)


int
t;cin>>t;

B.push_back(t);


swap(A,B);

for_each(A.begin(),A.end(),myprint);cout<<endl;

for_each(B.begin(),B.end(),myprint);cout<<endl;
return
0;


swap函数可以直接交换两个vector的值,其实是这样的:vector向量中重载了=操作符号,vector和vector之间可以直接赋值。

但是swap函数有一个缺点,就是无法交换2个迭代器的值,想要交换一个string中的两个要这么写的:
交换pos1和pos2两个位置的值。
string str;
int pos1,pos2;
cin>>str>>pos1>>pos2;
swap(str.begin()+pos1,str.begin()+pos2);
但是CE了,说明swap函数不能交换iterator。

注意:swap函数只能交换两个相同类型的值。
参考技术A 传进去的是int等简单类型,是传值,值改变后,不会影响调用语句的值、只在该函数内有效。

而传数组就不是,是传址,值改变后,调用的语句的值也会改变。追问

可是我并没有传她的引用,,,这里的R不是副本吗???

参考技术B 第一个swap(r[i], r[j])是值传递, 第二个是引用传递

编写一个函数swap,将指定数组按照从小到大的顺序排序,

编写一个函数swap,将指定数组按照从小到大的顺序排序,主函数中自定义一个数组,将数组和元素个数作为实参传递给swap,在主函数中输出排序结果。 在线等

void swap(int *a,n) //a是数组首地址,n数组成员个数

int i,j,temp
for(i=0,i<n-1,i++)
for(j=i+1,j<n,j++)

if *(a+i)>*(a+j)

temp=*(a+i)
*(a+i)=*(a+j)
*(a+j)=temp


参考技术A 冒泡法排序,这是基础啊。
http://baike.baidu.com/view/2012847.htm
参考技术B 同求!!!!

以上是关于SWAP函数的主要内容,如果未能解决你的问题,请参考以下文章

编写一个函数swap,将指定数组按照从小到大的顺序排序,

swap函数

交换函数swap的三种实现方法

Problem E: 编写函数:Swap (I) (Append Code)

swap 函数的编写

作业comp和swap函数