【问题标题】:Simplest 2D array, using g++, with one variable dimension?最简单的二维数组,使用 g++,具有一维变量?
【发布时间】:2014-08-03 20:11:09
【问题描述】:

我想做一个这样的数组:

double array[variable][constant];

只有第一个维度是可变的。将变量声明为第一维度会导致初始化错误。有没有一种简单的方法可以用指针或其他基本类型来做到这一点?

【问题讨论】:

  • 你可能想要std::vector<std::array<double,constant>>(variable)
  • 我会写一个类来包装一个std::vector<double>
  • @juanchopanza 为什么?出于速度原因?
  • @vsoftco 是的,确保数据都是连续的单个向量,以及确保可以维护不变量的包装器。
  • @juanchopanza 注意向量包含数组,所以数据是连续的。请您解释一下“可以维护的不变量”是什么意思?

标签: c++ arrays dynamic 2d


【解决方案1】:

最新的 C++ 标准中没有可变长度数组。你可以改用std::vector

std::vector<std::vector<double> > arr;

或者,例如,要修复第二个维度(在本例中为 10),您可以这样做

std::vector<std::array<double, 10> > arr1; // to declare a fixed second dimension

否则你需要使用旧指针,

double (*arr)[10]; // pointer to array-of-10-doubles

根据@Chiel 的评论,您可以提高性能

typedef double (POD_arr)[10];
std::vector<POD_arr> arr;

通过这种方式,您可以将所有数据连续存储在内存中,因此访问速度应该与使用普通的旧 C 数组一样快。

PS:似乎最后的声明违反了标准,因为正如@juanchopanza 提到的,POD 数组不满足将数据存储在 STL 数组中的要求(它们不可分配)。但是,g++ 编译上述 2 个声明没有任何问题,并且可以在程序中使用它们。但是clang++ 失败了。

【讨论】:

  • 我强烈建议不要在性能关键情况下使用嵌套类型,因为整个数组在内存中不会是连续的
  • @Chiel,std::vectorstd::array 都是连续的,但是是的,整个对象可能不具有连续的数据,因为 std::array 占用的空间超过了内部的包装数组。然后我想可以定义一个std::vector&lt;POD_arr&gt;,其中POD_arr 只是一个typedef double (POD_arr)[10]。如果我没有弄错的话,这应该使所有内容都连续。
  • 您不能将纯数组存储在标准库容器中。数组向量是一个很好的解决方案。数据位于单个块中。数组之间可能有填充,但其影响很小。唯一的问题是是否要求所有元素都是连续的。
  • @juanchopanza,您确定无法存储 POD 阵列吗?我只是对其进行了测试,它似乎可以正常工作,初始化正常,写入/读取正常,没有段错误。
  • @vsoftco 可以肯定,普通数组不可分配或复制。
【解决方案2】:

你可以做类似的事情,但它不是一个真正的二维数组。它基于一般思想,即在内部,多维数组必然与维度数组 (n, m) 的规则呈线性关系:array2d[i, j] = array1d[j + i*m]

#include "iostream"

using namespace std;

class dynArray {
private:
    double *array;
    int dim2;
public:
    dynArray(int variable, int constant) {
        array = new double[variable * constant];
    dim2 = constant;
    }
    ~dynArray() {
        delete array;
    }

    double value(int i, int j) {
        return array[j + i * dim2];
    }

    double *pt(int i, int j) {
        return array + j + i * dim2;
    }
};

int main(int argc, char*argv[]) {
    dynArray d(3,4);
    *d.pt(2,3) = 6.;
    cout << "Result : " << d.value(2,3) << endl;
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多