我使用的是gcc 4.6.3版。我想实现一个函数来分配二维矩阵并初始化它们。我使用了以下代码,但我想要一个基于模板(或通用)的代码。我想要一个泛型函数同时处理bool,float和double(所有情况下的过程都类似)。你能帮我一下,或者给我一个更好的方法来分配一个二维矩阵。
void doubleAlloc2D(double ** &t, int r, int c,double initialValue=0)
{
t=new double*[r];
if (!t)
{
if (DETAILS) std::printf ("Not enough memory.(code: 461546596551)\n");
getchar();
exit(-1);
}
for (int i=0;i<r;i++)
{
t[i] = new double[c];
if (!t[i])
{
if (DETAILS) std::printf ("Not enough memory.(code: 461651651)\n");
getchar();
exit(-1);
}
for (int j=0;j<c;j++)
t[i][j] = initialValue;
}
}
答案 0 :(得分:1)
你没有指定你想要通用的东西,但我猜 类型(可能是尺寸)。 通常的创建方式 C ++中的对象(包括容器,通用或非通用)是定义它 作为一个班级。类似的东西:
template <typename T, int rows, int columns>
class Matrix
{
std::vector<T> myData;
public:
Matrix( T const& init = T() )
: myData( rows * columns, init )
{
}
T* operator[]( int index )
{
return &myData[0] + index * columns;
}
T const* operator[]( int index ) const
{
return &myData[0] + index * columns;
}
// ...
};
如果您不希望行和列是编译时间常量, 从模板参数中删除它们,并将它们添加到 构造函数参数。不要忘记保存它们。
一个更复杂(但仍然不太难)的解决方案
将使用代理类作为返回值
operator[]
,而不是T*
。另一种常见的解决方案是
覆盖operator()( int i, int j )
以进行索引,并使用
m( i, j )
语法,而不是m[i][j]
。
永远不会在C ++中使用array new的任何原因。 C ++是 不是 C,你不应该试着像它那样编程。