先回顾一下上次我的指针博客
今天看书时候发现一个东西看不懂,不懂就查,不能一直半解
int *find(const vector<int> &vec,int value){
//省略.......
}
和
elemType* find(const elemType * array,int size,const elemType &value){
//省略.........
}
问题就在参数列表(应该是这么叫吧,不这么叫我回来修改)位置处为什么一会是&,一会是 *。
然后往前翻,结果翻到了相关知识点,正好恶补了一下。
www.broadview.com.cn/20934这是源码网站,但是打不开,害,还得自己敲
先夸一夸,这个思路真牛,不愧是lip(gallager)(哈哈)
代码自己敲的,经过调试,可以正常使用
#include <iostream>
#include <vector>
using namespace std;void display(vector<int> vec)
{for(int ix=0;ix<vec.size();++ix)cout<<vec[ix]<<" ";cout<<endl; } void swap(int val1,int val2){int temp=val1;val1=val2;val2=temp;}void bubble_sort(vector<int> vec){for(int ix=0;ix<vec.size();++ix)for(int jx=ix+1;jx<vec.size();++jx)if(vec[ix]>vec[jx])swap(vec[ix],vec[jx]);}int main(){int ia[8]={8,34,3,13,1,21,5,2};vector<int> vec(ia,ia+8);cout<<"vector before sort:";display(vec);bubble_sort(vec);cout<<"vector after sort:";display(vec);}
我们可知并无任何变化
在没有断点调试时候应该怎么办呢?那我们就要对这几个函数分别进行分块分析了
修改bubble_sort里面的函数
void bubble_sort(vector<int> vec){for(int ix=0;ix<vec.size();++ix)for(int jx=ix+1;jx<vec.size();++jx)if(vec[ix]>vec[jx]){cout<<"about to call swap"<<"ix: "<<ix<<"jx: "<<jx<<"\t"<<"swapping: "<<vec[ix]<<"with"<<vec[jx]<<endl;swap(vec[ix],vec[jx]);}}
结果为
我们可以发现一件事,swap()的确被调用了但是原来的vector仍然没有改变 意思是这样的,她是会每一次去查找符合要求的,但是每次的值固定不变
再思考,是不是swap()问题
void swap(int val1,int val2){cout<<"swap("<<val1<<","<<val2<<")\n";int temp=val1;val1=val2;val2=temp;cout<<"after swap(): val1 "<<val1<<"val2: "<<val2<<"\n";
}
可知bubble_sort正确的辨识出第一和第三个元素,其值分别是8和3,因此两个元素必须交换。swap()被成功调用,而且在swap()函数中两个值也的确交换了。但是,vector内部的值依然没有改变。
此时,我们因该考虑到参数传给swap()的传递方法
经过思考,可以解释为什么虽然将两值交换,其结果却没有反映到vector内的数值上。是的,其实传给swap()的对象被复制了一份,原对象和副本之间没有任何关系。
当我们调用一个函数时,会在内存中建立起一块特殊区域,称为“程序堆栈”。这块特殊区域提供了每个函数参数的储存对象。它也提供了函数所定义的每个对象的内存空间------我们将这些对象称为局部对象。 一旦函数完成,这块内存就会被释放掉,或者说pop出来
所以上述步骤 一直是在传值(复制),并没有传参 所以做一下小修改,让其传参,令swap()的参数和传入的实际对象产生关联
void swap(int &val1,int &val2){cout<<"swap("<<val1<<","<<val2<<")\n";int temp=val1;val1=val2;val2=temp;cout<<"after swap(): val1 "<<val1<<"val2: "<<val2<<"\n";
}
void swap(int &val1,int &val2) pass by reference 将参数声明为一个reference(地址)
我们可知除了main传给Bubble_sort()的vector未改变之外,每样事物都工作正确。
函数参数的传递应该采用传址,而不是传值
因为当我们将vec[ix]这样的对象传入函数,默认情形下其值会被复制一份,成为参数的局部性定义,这种叫传值。 void bubble_sort(vector<int> vec)是复制进去的值,所以swap也是里面修改,不影响外面的值
例如在void bubble_sort(vector<int> vec)中进行即使是进行双层循环后,即使是void swap(int &val1,int &val2) ,在交换数据时,是直接操作本体,不是复制的值,但是,函数参数的传递依然是传值
修改为void bubble_sort(vector<int> &vec)
以上