我在Xcode上用C ++编写一个简单的Bubblesort算法时遇到了麻烦。一个特殊的问题是得到数组的长度,我得到一个错误说"数组函数的sizeof将返回int *的大小而不是int []。"这是什么意思?我试图在数组{33,60,55,8,26}上测试算法,但对如何构造数组长度函数感到困惑。
#include <iostream>
#include <array>
using namespace std;
#define ARRAY_SIZE(array) (sizeof((array))/sizeof((array[0])))
void swap(int n1, int n2){
int temp = n1;
n1 = n2;
n2 = temp;
}
int count(int a[]){
int len=0;
for(int i = 0; i <= 20; i++){
if(a[i] >= 0){
len++; //len=len+1
}
}
return len;
}
template <size_t N>
void BubbleSort( int a[], size_t len ){
for(int i = 0;i <= len;i++){
if(a[i] > a[i+1]){
swap(a[i],a[i+1]);
}
}
}
void printr(int arr[]){
for(int i = 0; i <= len; i++){
cout<<arr[i]<<"\n";
}
}
int main(int argc, const char * argv[]) {
int arr[] = {33,60,55,8,26};
BubbleSort(arr, ARRAY_SIZE(arr));
printr(arr);
return 0;
}
答案 0 :(得分:2)
此时:
void BubbleSort( int a[] ){
a[]
的大小未知。出于所有意图和目的,它是int *
。您需要计算数组的已知长度,并将其传递给,例如
void BubbleSort( int a[], size_t len ){
称为:
int arr[] = {33,60,55,8,26};
BubbleSort(arr, ARRAY_SIZE(arr));
答案 1 :(得分:1)
#define ARRAY_SIZE(array) (sizeof((array))/sizeof((array[0])))
当应用于int[]
时,sizeof(array[0])
变为sizeof(int)
,但sizeof(array)
变为sizeof(int*)
(与sizeof(int[])
相同)。数组长度不存在:您需要单独存储它。
您应该使用std::vector<>
容器和标准库中的std::sort
函数。
顺便说一下,BubbleSort
函数,即使它的有效值为len
(例如,作为另一个函数参数),也是错误的。尝试排序{4,3,2,1}
:您需要两个嵌套循环。
答案 2 :(得分:0)
此功能,以及您示例中的类似功能:
void BubbleSort(int a[])
完全等同于将它们定义为:
void BubbleSort(int* a)
你只是拿指针。您无法仅通过指针确定数组的大小 - 那里的信息不足。 C方法是在各处传递大小:
void BubbleSort(int* a, size_t len)
但是在C ++中,我们可以通过推导数组大小来做得更好:
template <size_t N>
void BubbleSort(int (&a)[N]) // N is the length of the array
虽然更好的方法是使用std::vector
,这将使一切变得更容易处理:
void BubbleSort(const std::vector<int>& a) // a.size() is the length