有没有办法计算函数内arry的长度而不是作为参数传入?
Is there a way to calculate the length of an arry inside a function instead of pass in as parameter?
我是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]);
?
- 模板参数列表中的 false 在模板初始化期间计算为什么?
- 编译器是否强制根据模板参数计算表达式?
- 有没有办法计算函数内arry的长度而不是作为参数传入?
- 返回一个计算了参数的函数
- 术语的计算结果不是采用0个参数的函数
- 错误 C2064:术语的计算结果不是采用 3 个参数的函数
- 错误:一元"*"的类型参数无效(具有"int"):使用 mergesort 计算
- 委派的 ctor 是否受参数计算顺序的影响?
- 函数参数计算顺序与 Lambda 捕获评估顺序
- 大括号和括号之间的参数计算顺序
- 使用引用参数计算函数
- 编译时的模板参数计算
- 在 x86-64 平台上为 C(++) 中的 64 位无符号参数计算 (a*b)%n FAST
- 具有参数计算错误的重载函数
- 模板参数计算
- 根据其他参数计算模板参数的惯用方法
- 移动语义和参数计算顺序
- 惰性参数计算
- C++ 参数计算顺序
- 参数计算和未定义行为