c++排序算法的难点在于数组的长度

c++ sorting algorithm difficulty with array length

本文关键字:数组 算法 排序 c++ 于数组      更新时间:2023-10-16

我在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;
}

此时:

void BubbleSort( int a[] ){

CCD_ 1的大小是未知的。无论出于何种目的,它都是int *。您需要计算数组的已知长度,并将其传入,例如

void BubbleSort( int a[], size_t len ){

称为:

int arr[] = {33,60,55,8,26};
BubbleSort(arr, ARRAY_SIZE(arr));
#define ARRAY_SIZE(array) (sizeof((array))/sizeof((array[0])))

当应用于int[]时,sizeof(array[0])变成sizeof(int),但sizeof(array)变成sizeof(int*)(与sizeof(int[])相同(。数组长度不存在:需要单独存储。

您应该使用标准库中的std::vector<>容器和a[]0函数。

顺便说一下,BubbleSort函数,即使它有一个有效值len(比如说,作为另一个函数参数(,也是错误的。尝试对{4,3,2,1}进行排序:您需要两个嵌套循环。

此函数以及示例中的类似函数:

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