刚刚在复习排序算法时遇到一个问题
用vector作为传入参数时,返回的是未被排序的
void bubbleSort(vector<int> arr, int n){
//*(指针传递)和&(引用传递)都可
for(int i=0; i<n; i++){
for(int j=0; j<n-1; j++){
if(arr[j]>arr[j+1]){
swap(&arr[j], &arr[j+1]);
}
}
}
}
正确的两种方法如下
vector<int> bubbleSort(vector<int> arr, int n){
for(int i=0; i<n; i++){
for(int j=0; j<n-1; j++){
if(arr[j]>arr[j+1]){
swap(&arr[j], &arr[j+1]);
}
}
}
return arr;
}
void bubbleSort(vector<int> &arr, int n){
//*(指针传递)和&(引用传递)都可
for(int i=0; i<n; i++){
for(int j=0; j<n-1; j++){
if(arr[j]>arr[j+1]){
swap(&arr[j], &arr[j+1]);
}
}
}
}
虽然两种都ok但是肯定更喜欢第二种嘛,不用再另外声明一个数组空间。vector作为参数传递时如果用值传递,形参的改变是无法传递给实参。就像那个swap函数。
但是为什么array就可以…
void bubbleSort(int arr[], int n){
for(int i=0; i<n; i++){
for(int j=0; j<n-1; j++){
if(arr[j]>arr[j+1]){
swap(&arr[j], &arr[j+1]);
}
}
}
}
查了一下编译器以相同方式解释这两种声明:
void bubbleSort(int arr[], int n);
void bubbleSort(int *arr, int n);
这两种调用并不完全相同,第一种是指向整个数组的指针, 而第二个是指向第一个元素的指针,但是编译器把两种都当作指向第一个元素的指针。所以如果你要在调用函数中计算数组大小是没办法的。具体可以看看passing an array to a function formal parameter - stack overflow