【问题标题】:c++ sorting algorithm difficulty with array lengthc ++排序算法难度与数组长度
【发布时间】:2015-08-13 15:47:51
【问题描述】:

我在 Xcode 上用 C++ 编写简单的冒泡排序算法时遇到问题。一个特殊的问题是获取数组的长度,我收到一条错误消息:“数组函数上的 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;
}

【问题讨论】:

标签: c++ arrays sorting


【解决方案1】:

此时:

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));

【讨论】:

  • BubbleSort(int a[])BubbleSort(const int* a) 有何不同?有什么区别吗?后者会更具可读性吗?
  • 其余的代码不会改变。在这种情况下,这确实是一种风格选择。出于这个答案的目的,我不想更改比严格必要的更多的代码。
  • 我仍然收到一个错误:“用不同类型重新定义 'len':'int' vs 'size_t”
  • int len = ARRAY_SIZE(a);(在函数内部)现在既是多余的,又是不正确的。删除它。
【解决方案2】:
#define ARRAY_SIZE(array) (sizeof((array))/sizeof((array[0])))

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

您应该使用标准库中的std::vector&lt;&gt; 容器和std::sort 函数。

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

【讨论】:

    【解决方案3】:

    此功能,以及您示例中的类似功能:

    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
    

    【讨论】:

      猜你喜欢
      • 2012-10-30
      • 2020-11-08
      • 1970-01-01
      • 2012-02-20
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多