如何处理C++; 假设我想在C++中定义一个函数,比如 int sort( int a[n], int n)
我希望函数在没有预定义长度的数组上执行操作。我该怎么做?最惯用的方法是定义一个包含两个迭代器的函数:如何处理C++; 假设我想在C++中定义一个函数,比如 int sort( int a[n], int n),c++,C++,我希望函数在没有预定义长度的数组上执行操作。我该怎么做?最惯用的方法是定义一个包含两个迭代器的函数: template<typename Iter> int sort(Iter first, Itera last); template<typename Iterator> int mysort(Iterator begin, Iterator end) { ... } 模板 int排序(Iter优先,Itera最后); 在罗马时,按照罗马人的做法(“罗马”=标准库
template<typename Iter>
int sort(Iter first, Itera last);
template<typename Iterator>
int mysort(Iterator begin, Iterator end) { ... }
模板
int排序(Iter优先,Itera最后);
在罗马时,按照罗马人的做法(“罗马”=标准库)。使用指针:
int sort(int* a, int n)
您可以将函数设置为模板,以提供数组维度的句柄:
template <size_t N>
int mysort( int (&a)[N] )
{
/// access as a[n], where n is in range [0,N)
}
请记住,我将名称更改为
mysort
,因为标准库有一个著名的算法,名为。如果要使用该结构,您需要某种方法来确定数组的结尾。例如,作为字符数组的字符串使用空终止符。如果无法确定结构的结尾,则无法安全地对其进行迭代
指针方法将允许您在数组上迭代,但在迭代时无法安全地确定数组的结尾
int sort( int* arr )
{
// do your sorting here
}
有一些元素标记数组的结尾。这就是大多数字符串操作的工作方式,字符串的结尾用“\0”标记
理想情况下,您不会传递普通数组,而是传递一些更高级别的对象,如
std::vector
或std::array
编译器会忽略数组参数的大小,因为当您将数组传递给函数时,它会转换为指针。其实,
int sort( int a[], int n)
相当于
int sort( int* a, int n)
数组的大小在运行时之前是未知的,应该作为第二个参数传递。您不能完全按照要求执行。我想最接近的方法是使用
std::vector
int排序(std::vector&a)
{
...
}
std::vector
支持所有常用的数组操作(a[i]
等)以及其他一些操作,如a.size()
以获取向量的大小。不管它看起来如何,该函数不需要一个具有预定义长度的数组,如果你认为它需要一个特定的长度,并且你希望它长一个可变的长度或者另一种方式,那么它就不清楚。注意,<>代码> STD::Endo/<代码>与动态分配的数组不太好,因为C++中的数组通常不知道它们的长度。(std::end(real_array\u not_a_指针)
只起作用,因为编译器看到您将该变量声明为特定大小的数组。)因此您必须传递begin
和begin+size
。但是找到begin+size
,当然,需要在某个时候知道size
。@cHao正确。当然,第一种选择也不一样。它实际上并不等同。除非n
是前面声明的常量表达式,否则它就是无效代码。@jrok我以为编译器会忽略指定的大小。我知道,如果你不指定大小,那么这两个大小是相等的…编辑后显示出来。你是对的,它忽略了它,问题是声明的要点<代码>常量int n=5;整数排序(整数a[n],整数n)代码>就可以了,它会按照你说的那样运行。有点吹毛求疵:)
int sort( int* a, int n)
int sort(std::vector<int>& a)
{
...
}