【问题标题】:Statically declared 2-D array C++ as data member of a class [duplicate]静态声明二维数组 C++ 作为类的数据成员 [重复]
【发布时间】:2016-03-21 05:00:10
【问题描述】:

我正在尝试创建一个class grid,其中包含数据成员unsigned NRunsigned NC,它还应该包含一个二维数组double Coordiantes[NR][NC]。我希望通过类构造函数初始化数据成员NRNC。我试图避免二维数组的动态分配,因为我更喜欢连续的内存分配,以尽可能避免缓存未命中。

我不确定这是否可能,但任何输入都会有所帮助。

【问题讨论】:

  • 为什么不使用 std::vector 代替?
  • 我相信在编译时必须知道 NR 和 NC 才能创建这样的静态数组。你看过stackoverflow.com/questions/21943621/…吗?
  • vector< vector<double> > 可以解决这个问题,但我最近才知道访问vector< vector<double> > Adouble A[m][n] 相比相当慢。
  • @DanielB.谢谢,正是我需要的。
  • c++ 不可能...现在...

标签: c++ arrays multidimensional-array


【解决方案1】:
class Array2D {
public:
    vector<int> v;
    int nc;
    Array2D(int NR, int NC) : v(NR*NC), nc(NC) {}
    int* operator[](int r) { return &v[r*nc]; }
};

int main()
{
    Array2D array2d(2, 3);
    array2d[0][0] = 1;
    array2d[1][2] = 6;
}

这允许您创建一个功能类似于二维数组的类。速度快,数据连续。

【讨论】:

  • 这是我见过的最干净的实现。特别好的是使用 内置运算符 [] 来访问内容,而无需专门为第二维实现它。
  • @SomeWittyUsername - 谢谢!可能有助于我最初是一名 C 程序员。不过我确实喜欢现代 C++。
【解决方案2】:

我建议您直接使用std::vector&lt;double&gt;(NC*NR)
并通过coord.at(i*NC + j)(或coord[i*NC + j],当您的代码正确并且想要从中收集性能时)对其进行索引。

您将获得连续的内存和缓存友好的循环,而无需自己进行内存分配。尽可能选择 RAII。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 2012-07-03
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    相关资源
    最近更新 更多