假设我想在C ++中定义一个函数,比如
int sort( int a[n], int n)
我希望函数在没有预定义长度的数组上执行操作。我该怎么做?
答案 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::vector
或std::array
。