如何在这种情况下使用模板

时间:2017-07-20 08:50:28

标签: c++

我制作了这样的模板:

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;
}

我应该在第一个参数中添加什么?

1 个答案:

答案 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