在C ++中实现2D数组的最省时的方法是什么?

时间:2017-07-24 04:42:18

标签: c++ matrix

在C ++中实现2D数组的最省时的方法是什么?我关心的是:插入,删除和查找。

我已经阅读过这两种方法:

  1. vector<vector<int>> - 嵌套向量
  2. vector<vector<int>*> - 使用指向其他向量的向量
  3. 我发现第一个选项很容易实现,但还有另一种方法更节省时间吗?

2 个答案:

答案 0 :(得分:2)

我的建议:

  1. 创建一个班级Matrix
  2. 仔细定义界面,以免暴露内部数据结构细节。
  3. 首先使用捕获数据的方法之一。我建议从std::vector - 一维数组开始。
  4. 如果遇到任何性能或维护问题,请更改内部数据以使用其他策略。

答案 1 :(得分:2)

要初始化大小为MxN的矩阵,您所要做的就是:

std::vector<std::vector<dataType>> MyMat = std::vector<std::vector<dataType>>(M,std::vector<dataType>(N,0));

但是,我必须提到这是创建矩阵的一种可怕的方法。你通过这种方式编写矩阵来扼杀性能。这是因为当您执行矩阵乘法时,处理器使用一个名为vectorization的东西在一条指令中将多个数字相乘,并且当您执行此操作时,会使处理器更难处理。此外,这会杀死缓存局部性,因为不同的行(或列)在内存中不会连续,使得所有内容都慢了几百倍。

如果您有兴趣,请考虑阅读thisthis

执行此操作的正确方法是使用向量创建一个类(可能):

std::vector<dataType> MyMat(M*N,0);

然后创建一个将按元素访问元素的访问者:

dataType& getElement(int i, int j)
{
    return MyMat[M*i+j];
}

这样您就可以获得最佳性能。当然,还有更多关于性能的细节,但这足以回答你的问题。

是的,你不应该自己做矩阵操作。在最好的情况下,如果你是一个专业的高性能开发人员,你应该使用一些LAPACK实现来为你做矩阵操作(就像Armadillo的那些人那样)。 / p>