2
4

4 回答 4

1

当你这样做时:

std::cin >> Asize;
int A[Asize]; // Not standard

您使用编译器的扩展来使用 VLA(可变长度数组)。更喜欢使用std::vector(然后你有void insertionSort(std::vector<int> &v))。

如果你不能使用std::vector,你可以使用:

std::unique_ptr<int[]> A(new int [Asize]);

由于大小仅在运行时已知,因此您必须将大小传递给您的函数:

void insertionSort(int* a, std::size_t size)

并调用insertionSort如下:

insertionSort(A.get(), ASize);

使用已知的编译时间大小的数组,

void insertionSort(int (&A)[42])

是通过引用传递数组的正确方法。

于 2014-10-09T07:56:00.740 回答
0

数组可以通过引用传递,例如:

void somefunc(int (&arr)[30]) {}

这将确保您不能为此数组传递任何其他大小(固定大小数组):因此,您不能这样做:

int a[40];
func(a); // compilation error

但是,也可以通过引用传递任意大小的数组,例如:

template<typename T, size_t N>
void somefunc2(T (&arr)[N])
{
    // N can be used as size, as required, instead of querying size of the array
}

因此,修正后的功能如下:

template<typename T, size_t N>
    void insertionSort(T (&A)[N]) // ok, now
    {
        for (size_t j=1; j < N; j++) 
        {
            int key = A[j];
            //now insert A[j] into the sorted sequence a[0...j-1].
            int i = j-1;
            while (i >= 0 && A[i] > key)
            {
                A[i+1] = A[i];
                i -= 1;
            }
            A[i+1] = key;
        }
    }
于 2014-10-09T04:01:36.740 回答
0

重要的是要记住 C 数组只是指向数组第一个元素的指针。传递数组很容易,您只需执行以下操作:

void foo(int *array)

或者

void foo(int array[])

然而,由于它只是一个指向它的基类型的指针,它没有可调用的成员函数,并且它不知道内存结构在它之外是什么样子(即没有长度的概念)。如果您想知道传递的动态数组的长度,那么您需要将长度作为第二个参数传递,大概创建数组的任何东西都应该知道它的长度。

void foo(int *array, unsigned int length)

或者,您可以避免所有这些并使用在概念上类似于 java 中的 ArrayList 的向量。

于 2014-10-09T03:52:35.403 回答
-6

尝试使用应该在 Borland c++ builder 中工作的 Array.length

于 2014-10-09T03:30:57.757 回答