我花了一个小时试图解决这个问题 - 我如何编写这个函数(在代码顶部--insertSort),它允许我通过引用传递一个数组。在某种程度上,我可以拨打' .size'在阵列上。它必须是这个任务的数组。
我试过不通过引用传递它,在调用它之前取消引用数组,等等。我一直收到错误:(。
这是此代码的最新编译器错误:
insertionSort.cpp:11:错误:参数'A'包含对未知绑定数组的引用'int []' insertionSort.cpp:在函数'void insertionSort(int(&)[])'中: insertionSort.cpp:13:错误:请求'(int )A'中的成员'size',它是非类型'int'
#include <iostream>
//#include <array> - says no such file or directory
using namespace std;
void insertionSort(int (&A)[]) <-----ERROR HERE
{
for (int j=1; j <= A->size(); j++) <-----ERROR HERE
{
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;
}
}
int main()
{
int Asize = 0;
cout << "Hello. \nPlease enter a number value for the insertionSort Array size and then hit enter: " << endl;
cin >> Asize;
int A[Asize];
char Atype;
cout << "There are three ways to order your inserstionSort array; \nb - for best case \nw - for worst case \na - for average case" << endl << "Which type do you desire for this array? \nPlease enter 'b', 'w', or 'a': " << endl;
cin >> Atype;
if (Atype == 'b')
{
cout << "You have chosen type b." << endl;
}
else if (Atype == 'w')
{
cout << "You have chosen type w." << endl;
}
else if (Atype == 'a')
{
cout << "You have chosen type a." << endl;
}
cout << "Terminate Program" << endl;
}
答案 0 :(得分: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])
是通过引用传递数组的正确方法。
答案 1 :(得分:0)
重要的是要记住C数组只是指向数组第一个元素的指针。传递数组很简单,你可以这样做:
void foo(int *array)
或
void foo(int array[])
然而,因为它只是指向它的基类型的指针,所以它没有要调用的成员函数,并且它不知道内存结构在它之外是什么样的(即没有长度概念)。如果你想知道传递的动态数组的长度,那么你需要将长度作为第二个参数传递,大概是创建的数组应该知道它的长度。
void foo(int *array, unsigned int length)
或者,你可以避免所有这些,并使用概念上类似于java中的ArrayList的向量。
答案 2 :(得分: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;
}
}
答案 3 :(得分:-5)
尝试使用可在Borland c ++ builder
中使用的Array.length