有没有办法计算函数内arry的长度而不是作为参数传入?

Is there a way to calculate the length of an arry inside a function instead of pass in as parameter?

本文关键字:参数 计算 函数 arry 有没有      更新时间:2023-10-16

我是C++新手,这是我编写的一个模板选择排序函数,它接受一个数组及其长度作为参数。 """>

template <class T>
void mySort(T a[], int len) {
for (int i = 0; i < len; i++)
{   
int min = i;
for (int j = i+1; j < len; j++)
{
if (a[min]>a[j])
{
min = j;
}
}
if (min!=i)
{
T tmp = a[min];
a[min] = a[i];
a[i] = tmp;
}
}
}

这里有几件我感到困惑的事情
首先,我知道如果我们把数组传递给一个函数,它实际上不是这个数组的副本,那么这背后的整个概念是什么?我们传递的是它的引用还是指向第一个索引的指针?

其次,是否可以在此函数中计算此数组的长度,而不是作为参数传入?

第三,人们告诉我最好在 c++ 中使用 char[] 而不是字符串,因为 char[] 与 fundimental c 更相关,而字符串在 c++ 中只是 STL,所以这意味着对于我的大部分代码,我应该使用 char[] 而不是字符串?

首先,我知道如果我们把数组传递给一个函数,它实际上不是这个数组的副本,那么这背后的整个概念是什么?我们传递的是它的引用还是指向第一个索引的指针?

它是指向第一个元素的指针。即使您编写了T a[],该语言也会在函数参数中将其转换为T* a。这很奇怪,但我们开始了;这就是"按值传递数组"在 C 和 C++ 中的工作方式(或不起作用(。

其次,是否可以在此函数中计算此数组的长度,而不是作为参数传入?

不。该信息无法从类型中获得,因此必须将其作为单独的参数传递。

解决方法包括通过引用传递数组本身:

template <class T, std::size_t N>
void mySort(T (&a)[N]) {

...或传递std::array或传递std::vector,所有这些都"知道"维度。

第三,人们告诉我最好在 c++ 中使用 char[] 而不是字符串,因为 char[] 与 fundimental c 更相关,而字符串在 c++ 中只是 STL,所以这意味着对于我的大部分代码,我应该使用 char[] 而不是字符串?

这与通常的建议相反。虽然使用char数组并不邪恶,并且可以在你有一些不需要动态分配的简单数组的地方完成,但std::string更灵活、更易于使用,通常应该是字符数组的首选工具。

我不知道"这只是C++中的 STL"作为论点是什么意思。

如果你在做"竞争性编程",通常的惯例可能不适用,但这不是真正的编程。

template<class T, std::size_t n> void mySort(T (&a)[n]);