我正在尝试创建一个方法来创建一个给定大小加倍的数组,然后用原始值填充数组的前半部分,而后半部分用相反的顺序填充原始值。我已经完成了这个,但下一个任务是让方法接受泛型类型的数组,我卡住了,不知道从哪里开始 我的代码到目前为止:
template <typename T>
T& *copy_and_reverse(T& *a, int length) {
T& *result = new T&[length*2];
int w = length-1;
for (int i = 0; i < length * 2; i++) {
if (i < length) {
result[i] = a[i];
} else {
result[i]=a[w];
w--;
}
}
return result;
}
int main() {
double numbers[5]={8.364,4.3,5.3,9.6,7.645};
int size=sizeof numbers/sizeof(double);
double *pointertonumbers;
pointertonumbers=copy_and_reverse(numbers, size);
for(int i=0;i<size*2;i++){
cout<<pointertonumbers[i]<<"\n";
}
}
目前代码不起作用,因为我得到多个“错误:无法声明指向'T&amp;'”
答案 0 :(得分:1)
首先,您无法创建指向引用的指针(您要执行的操作)。对指针的引用将是T* &a
。并且你不应该返回指向引用的指针(也可以引用指针,因为它会创建悬空引用)
实际上,最好是安全并接受对数组的引用。
T* copy_and_reverse(T (&a) [N]) {
T *result = new T[N*2];
size_t w = N-1;
for (size_t i = 0; i < N * 2; i++) {
if (i < N) {
result[i] = a[i];
} else {
result[i]=a[w];
w--;
}
}
return result;
}
int main() {
double numbers[5]={8.364,4.3,5.3,9.6,7.645};
int size=sizeof numbers/sizeof(double);
double *pointertonumbers;
pointertonumbers=copy_and_reverse(numbers);
for(int i=0;i<size*2;i++){
std::cout<<pointertonumbers[i]<<"\n";
}
delete [] pointertonumbers;
}
这仍有问题。你不应该忘记删除一个函数的结果。使用C ++ 11,您可以使用std::array
s重写非常安全:
std::array<T, N*2> copy_and_reverse(const std::array<T, N>& orig) {
std::array<T, N*2> result;
std::copy(orig.begin(), orig.end(), result.begin());
std::copy(orig.begin(), orig.end(), std::reverse_iterator<typename std::array<T, N*2>::iterator>(result.end()));
return std::move(result);
}
int main() {
std::array<double, 5> numbers = {{8.364,4.3,5.3,9.6,7.645}};
auto pointertonumbers(copy_and_reverse(numbers));
for(size_t i=0;i<pointertonumbers.size();i++){
std::cout<<pointertonumbers[i]<<"\n";
}
}
在这里你完全摆脱了指针(及其所有问题)。
答案 1 :(得分:0)
如果compilre说它不能声明指向T&amp;然后尝试声明对T *的引用。也许编译器在这种情况下会很开心。:)
T * copy_and_reverse( const T *a, int length) {
T *result = new T[length*2];
至于我,我会使用标准算法std :: copy。例如
template <typename T>
T * copy_and_reverse( const T *a, size_t length)
{
T *result = new T[ 2 * length ];
std::copy( a, a + length, result );
std::copy( a, a + length, reverse_iterator<int *>( result + 2 * length ) );
return result;
}