问问题
3872 次
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 回答