2

如何仅通过标准库引用二维数组来动态创建一维数组?</p>

可以通过构造重载来完成operator []吗?

示例:我想通过创建一个一维数组来形成一个矩阵,然后以使用二维数组的形式使用它。

// in class, a matrix created by:
p = new double[m*n]();

when using it, I'd like to use it like this:
for(i=0; i<10; i++)
    for(j=0; j<10; j++)
        a[i][j] = 0.0;

我想过使用运算符重载operator []和变量测试来证明“[]”是否第一次出现,但上面的结果是

错误:“double[int]数组下标的类型无效”

有可能这样做吗?

4

3 回答 3

1

我建议要么使用手动索引计算:

a = new double[m*n]();

for(i=0; i<10 && i<m; i++)
    for(j=0; j<10 && j<n; j++)
        a[i*n+j] = 0.0; 

反向计算将是:i = index/n, j = index % n

或者,使用 valarray:

#include <valarray>
// ....

     a[std::slice(i, n, m)][j] = 0.0;

std::gslice使用(这是广义切片,接受多个维度)可以获得更好的结果。我现在没有时间制作一个完整的例子。

这是 N. Josuttis 的一个非常强大的示例的链接:

于 2011-12-20T10:12:23.143 回答
1

operator()如果您不介意类似 Fortran 的语法,那么很容易做到这一点。我喜欢使用这样的辅助类:

template <class T>
class Indexer2D
{
public:
    Indexer2D(size_t w, size_t h, T *theData) :
        width(w), height(h), data(theData)
    { }

    T& operator() (size_t row, size_t col)
    {
        return data[(width * row) + col];
    }
private:
    size_t width;
    size_t height;
    T *data;
};

您的代码如下所示:

p = new double[m*n]();

Indexer2D<double> pMatrix(m, n, p);
pMatrix(1,4) = 23.9;

这为您提供了具有最小内存分配的良好语法。它不会检查您的界限,但这样做很容易。如果您需要最小的重量,您也不必存储高度。

于 2011-12-20T14:44:50.583 回答
0

如果你可以使用额外的内存,你可以这样做:

// Allocate 1D array
double * p = new double[m*n]();
// Allocate pointers for 2D reference
double ** p2D = new double *[m];

// set 2D pointers to allocated memory
for (i = 0; i < m; i++)
    p2D[i] = &p[i * n];

for(int i=0; i<m; i++)
    for(int j=0; j<n; j++)
        p2D[i][j] = 0.0; 
于 2011-12-20T14:30:23.133 回答