首先,您可以阅读Why pointer to pointer and vector of vector is bad for simple matrixs。您需要输入密码“p2pbad”(不带“”)。
这条线
cout << "Valor en (11, 5) --> " << matriz[11][5] << endl;
将尝试访问一个不存在的元素,因为您的矩阵只有 10 行,但您想从第 11 行获取数据 -> 分段错误。出于同样的原因,条件
if( i == 11 && j == 5)
没有意义。我永远不会是 11 岁i == 10
,在下一个条件下也不会是真的i<10
。
为通用矩阵处理编写非常好的代码是一项艰巨的任务,但您可能需要付出一些努力才能编写一个简单/基本的模板化矩阵类。
使用 std::allocator 的基本示例如下
template <typename _T>
class basic_matrix
{
public:
typedef basic_matrix<_T> this_type;
typedef ::std::allocator<_T> alloc;
typedef typename alloc::value_type value;
typedef typename alloc::pointer ptr;
typedef typename alloc::const_pointer const_ptr;
typedef typename alloc::reference ref;
typedef typename alloc::const_reference const_ref;
typedef typename alloc::size_type size;
typedef typename alloc::difference_type diff;
typedef _T&& r_ref;
basic_matrix (void)
: _data(nullptr), _x(0U), _y(0U)
{
}
basic_matrix (size const & x, size const & y)
: _data(nullptr), _x(0U), _y(0U)
{
resize(x,y);
}
~basic_matrix (void)
{
if (!empty()) clear();
}
void resize (size const &x, size const &y)
{
if (x == 0 && y == 0)
{
clear();
}
else
{
ptr new_location = _Allocate(x*y);
if (!empty())
{ // old data existent -> copy it
try
{
size const N = min(x, _x), M = min(y, _y);
for (size i=0; i<N; ++i)
{
for (size j=0; j<M; ++j)
{
*(new_location + i*y + j) = *(_data + i*_y + j);
}
}
}
catch (...)
{
_Deallocate(new_location, x*y);
clear();
throw;
}
}
_data = new_location;
_x = x;
_y = y;
}
}
ref operator() (size const &x, size const &y)
{
if (x >= _x || y >= _y) throw std::exception("OUT OF RANGE");
return *(_data + x*_y + y);
}
const_ref operator() (size const &x, size const &y) const
{
if (x >= _x || y >= _y) throw std::exception("OUT OF RANGE");
return *(_data + x*_y + y);
}
bool empty (void) const
{
return (_data == nullptr);
}
void clear (void)
{
_Deallocate(_data, _x*_y);
_data = nullptr;
_x = 0U;
_y = 0U;
}
protected:
ptr _data;
size _x, _y;
alloc _allocator;
ptr _Allocate (size const &num)
{
ptr new_location;
try
{
new_location = _allocator.allocate(num);
}
catch (...)
{
clear();
throw;
}
return new_location;
}
void _Deallocate (ptr location, size const &num)
{
_allocator.deallocate(location, num);
}
};
您将需要添加一个复制构造函数和一个赋值运算符以及其他一些东西......无论您希望矩阵接口的行为如何......
这可以使用如下代码工作:
int main (void)
{
basic_matrix<int> matriz(10, 12);
// Defino una matriz de 10x12
for (int i=0; i<10; i++)
{
for (int j=0; j < 12; j++)
{
if( i == 9 && j == 7)
matriz(i,j) = 5;
else if( i == 3 && j == 11)
matriz(i,j) = 4;
else
matriz(i,j) = 0;
}
}
cout << "Valor en (10, 7) --> " << matriz(9,7) << endl;
cout << "Valor normal 0 en (4, 4) --> " << matriz(4,4) << endl;
cout << "Valor en (3, 11) --> " << matriz(3,11) << endl;
return 0;
}
它打印:
Valor en (10, 7) --> 5
Valor normal 0 en (4, 4) --> 0
Valor en (3, 11) --> 4