如何处理C++中在数组上定义的函数
How to deal with functions defined on arrays in C++
假设我想在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::vector
或std::array
。
相关文章:
- 当我使用自定义类型创建动态数组时,即使使用字符串,它似乎也不起作用
- C++编程从外部文本文件定义数组大小
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- 删除动态数组时未定义标识符
- 在定义字符数组(井字游戏)的 for 循环中应用输入限制
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 模板类中的数组定义
- C 结构数组定义
- 在C++中为指针数组定义NULL
- 为什么局部变量不隐藏数组定义中的全局变量
- 静态数组定义错误 C++
- C++ 二维数组定义
- 这是否是 C++ 中的有效 2D 数组定义
- 模板类数组定义不是类型名称、静态或枚举器C++
- 用静态2d数组定义类的方便方法是什么(并且2d数组的大小只有在编译时才知道)
- 如何将字符数组定义为常量
- 二维数组定义
- 如何保护数组定义,防止使用非零值进行不完整的初始化
- 为3D数组定义setter/getter属性
- 在静态成员数组定义中对自身使用sizeof操作符