【发布时间】:2012-10-30 05:06:56
【问题描述】:
有些人可能知道也可能不知道您可以使用以下代码获取函数的数组参数的大小:
template<typename DataType, size_t SIZE>
void SortingAlgorithm(DataType (&array)[SIZE])
{
...
return;
}
其中 SIZE 可用于表示数组中元素的数量,允许程序员使用您的函数将数组作为参数传递而无需显式传递长度。例如,程序员可以这样做:
SortingAlgorithm( arrayToBeSorted ); //the length is not passed here, which is fine
对于可以相对容易地以迭代方式实现的算法,这很好。但我试图用其他递归算法来做到这一点。每个人的代码可能如下所示:
template<typename DataType, size_t SIZE>
void SortingAlgorithm(DataType (&array)[SIZE])
{
DataType newArray[SIZE];
memcpy(newArray,array, SIZE); //copy to a new array
SortingAlgorithm( newArray );
...
return;
}
但这每次都会抛出一个错误,提示程序需要不同的参数类型,类型转换失败,并显示尝试多次对 newArray 数组的 SIZE 说明符进行类型转换,程序失败。但是,如果我在进行递归调用之前使用实际值来定义 newArray 的大小,它不会吐出这些错误,如下所示:
DataType newArray[10]; //arbitrary number, but the compiler accepts this.
为什么可变大小的数组会导致错误?还有没有办法实现一个递归算法,它接受一个数组作为输入,但不需要数组的长度作为参数,因为它可以在函数调用中每次确定数组的长度?
【问题讨论】:
-
SortingAlgorithm<DataType, SIZE>( newArray );工作吗? -
您知道这样做的不利之处在于,将为您需要排序的每个大小的数组生成一个新的排序例程实例,对吧?除非您对交易代码大小非常激进以提高速度,否则模板分类器的主体应该类似于
SizeGenericSortingAlgorithm(array, SIZE),调用template<typename DataType> void SizeGenericSortingAlgorithm(DataType *array, size_t size)。 -
你能贴出真实的例子吗?错误是什么?
-
这里的目标是弄清楚我是否可以通过不需要程序员跟踪他/她正在使用的数组的大小来方便地使用递归排序算法。
-
@kjh 在这种情况下为什么不使用 std::vector?
标签: c++ arrays templates types recursion