java有可以获得数组大小的函数,但是c++没有,在写函数的时候发现了一些问题,就是传数组名的时候,会在函数中将数组退化成指针,得不到想要的结果,使用引用之后就不会有这样的问题
#include<iostream>
#include<typeinfo>
#include<vector>
using namespace std;
// 使用 int[]
template <typename T>
inline int get_array_len(T &p)
{
return sizeof(T) / sizeof(*p);
}
void insertsort(int arr[], int n)
{
int j = 0;
for(int i = 2; i < n; i++)
{
if(arr[i] < arr[i-1])
{
arr[0] = arr[i];
for(j = i-1; arr[0] < arr[j]; j--)
{
arr[j + 1] = arr[j];
}
arr[j + 1] = arr[0];
}
}
}
template <typename T>
inline void insertsort(T &arr)
{
insertsort(arr, get_array_len(arr));
}
// 使用 vector<int> *或者用引用,就不需要->了
void insertsort_vec(vector<int> *arr)
{
for(int i = 2; i < arr->size(); i++)
{
if(arr->at(i) < arr->at(i-1))
{
arr->at(0) = arr->at(i);
int j;
for(j = i - 1; arr->at(0) < arr->at(j); j--)
{
arr->at(j+1) = arr->at(j);
}
arr->at(j+1) = arr->at(0);
}
}
}
int main()
{
vector<int> vec {0, 9, 8, 7, 6, 5, 4, 3, 2, 1};
int arr[] = {0, 9, 8, 7, 6, 5, 4, 3, 2, 1};
insertsort(arr);
insertsort_vec(&vec);
cout << "使用vector *的insertsort函数后,结果为:" << endl;
for (auto i = vec.begin() + 1; i != vec.end(); ++i)
{
cout << *i << (i + 1 != vec.end() ? ' ': '\n');
}
cout << endl << "使用int[]的insertsort函数后,结果为:" << endl;
int len = get_array_len(arr);
//因为传数组名后会退化为指针,所以不能写函数来直接计算数组大小
for (int i = 1; i < len; i++)
{
cout << arr[i] << (i + 1 != len ? ' ': '\n');
}
int ar[30];
int *p = ar;
cout << endl;
//输出结果就可以看出来数组名不是都代表一个意思,代表数组或者首地址
cout << "int ar[30]; // ar的类型是:" << typeid(ar).name() << endl;
cout << "int *p = ar; // p的类型是:" << typeid(p).name() << endl;
return 0;
}