我制作了这样的模板:
template<class T>
void changeLength1D(T*& a[], int oldLength, int newLength)
{
T* temp = new T[newLength];
int number = min(newLength, oldLength);
copy(a, a + number, temp);
delete[] a;
a = temp;
}
当我想要使用此模板时:
#include<iostream>
#include <iterator>
using namespace std;
#include"changeLength1D.h"
int main()
{
int a[] = { 6,5,8,4,3,1 };
int n = 6;
changeLength1D(*a[], n,4);
copy(a, a + n, ostream_iterator<int>(cout, " "));
return 0;
}
我应该在第一个参数中添加什么?
答案 0 :(得分:1)
一个巧妙的技巧:你可以找到带有模板的数组的大小,所以不需要传入它。
template<size_t n>
int f(int(&c)[n])
{
}
可以在数组上调用,n是大小。
如果我们稍微更改你的模板,我们可以使用它,所以然后传递一个更少的参数,但我会进行其他更改,所以我们不删除堆栈中的东西:
template<class T, int oldLength>
T * changeLength1D_again(T (&a)[oldLength], int newLength)
{
T* temp = new T[newLength];
int number = min(newLength, oldLength);
copy(a, a + number, temp);
//delete[] a; may have been on stack - so no.
//a = temp; //again, if was on stack, no
return temp;
}
然后就这样打电话
int * changed = changeLength1D_again(a, 4);
copy(changed, changed + n, ostream_iterator<int>(cout, " "));
这样,它就不会尝试删除原始a
。
您似乎正在尝试动态调整堆栈数组的大小;哪个不行。如果你使用std :: vector,那么你的生活会更轻松。
std::vector<int> v={ 6,5,8,4,3,1 };
v.resize(4); //now has just four, but some spare capacity, which might be ok
v.shrink_to_fit(); //if you need to