c++如何获得数组的大小

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

猜你喜欢

转载自blog.csdn.net/m0_37787222/article/details/79058233
今日推荐