如何处理C++中在数组上定义的函数

How to deal with functions defined on arrays in C++

本文关键字:数组 定义 函数 C++ 何处理 处理      更新时间:2023-10-16

假设我想在C++中定义一个类似的函数

int sort( int a[n], int n)

我希望函数在没有预定义长度的数组上执行操作。我该怎么做?

您可以将函数作为一个模板来处理数组的维度:

template <size_t N>
int mysort( int (&a)[N] )
{
  /// access as a[n], where n is in range [0,N)
}

但是,由于它也适用于标准库容器和动态大小的数组,因此更惯用的方法是传递两个迭代器:

template<typename Iterator>
int mysort(Iterator begin, Iterator end) {  ... }

然后

int arr[] = {1,54,3,7,9,87};
mysort(arr);
mysort(std::begin(arr), std::end(arr));

请记住,我将名称更改为mysort,因为标准库有一个著名的算法std::sort

最常用的方法是定义一个使用两个迭代器的函数:

template<typename Iter>
int sort(Iter first, Itera last);

入乡随俗("罗马"=标准图书馆)。

编译器忽略数组参数的大小,因为当您将数组传递给函数时,它会转换为指针。事实上,

int sort( int a[], int n)

相当于

int sort( int* a, int n)

数组的大小要到运行时才能知道,应该作为第二个参数传递。

如果要使用该结构,则需要某种方法来确定数组的末尾。例如,作为字符数组的字符串使用null终止符。如果你没有办法确定结构的末尾,你将无法安全地对其进行迭代

指针方法允许您对数组进行迭代,但在迭代时无法安全地确定数组的末尾。

int sort( int* arr )
{
    // do your sorting here
}

你不能完全按照你的要求去做。我想最接近的是使用std::vector<int>

int sort(std::vector<int>& a)
{
    ...
}

std::vector支持所有常见的数组操作(a[i]等),再加上一些其他操作,如a.size(),以获得向量的大小。

使用指针:

int sort(int* a, int n)

有一些标记数组结束的元素。这就是大多数字符串操作的工作方式,字符串的末尾用"\0"标记。

不过,理想情况下,您不会传递普通数组,而是传递一些更高级别的对象,如std::vectorstd::array