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

时间:2013-08-27 20:29:58

标签: c++

假设我想在C ++中定义一个函数,比如

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

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

7 个答案:

答案 0 :(得分:5)

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

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

在罗马时,像罗马人一样(“罗马”=标准图书馆)。

答案 1 :(得分:5)

您可以将函数设为模板,以便处理数组的维度:

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的着名算法。

答案 2 :(得分:2)

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

int sort( int a[], int n)

相当于

int sort( int* a, int n)

在运行时才会知道数组的大小,并且应该作为第二个参数传递。

答案 3 :(得分:1)

如果要使用该结构,则需要某种方法来确定数组的结尾。例如,字符串作为char数组使用null终止符。如果您无法确定结构的结尾,则无法安全地迭代它。

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

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

答案 4 :(得分:1)

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

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

std::vector支持所有常用的数组操作(a[i]等)以及更多内容,例如a.size()以获取向量的大小。

答案 5 :(得分:0)

使用指针:

int sort(int* a, int n)

答案 6 :(得分:0)

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

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