如何处理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)
{
    ...
}