在C ++中实现2D数组的最省时的方法是什么?我关心的是:插入,删除和查找。
我已经阅读过这两种方法:
vector<vector<int>>
- 嵌套向量vector<vector<int>*>
- 使用指向其他向量的向量我发现第一个选项很容易实现,但还有另一种方法更节省时间吗?
答案 0 :(得分:2)
我的建议:
Matrix
。std::vector
- 一维数组开始。答案 1 :(得分:2)
要初始化大小为MxN
的矩阵,您所要做的就是:
std::vector<std::vector<dataType>> MyMat = std::vector<std::vector<dataType>>(M,std::vector<dataType>(N,0));
但是,我必须提到这是创建矩阵的一种可怕的方法。你通过这种方式编写矩阵来扼杀性能。这是因为当您执行矩阵乘法时,处理器使用一个名为vectorization
的东西在一条指令中将多个数字相乘,并且当您执行此操作时,会使处理器更难处理。此外,这会杀死缓存局部性,因为不同的行(或列)在内存中不会连续,使得所有内容都慢了几百倍。
执行此操作的正确方法是使用向量创建一个类(可能):
std::vector<dataType> MyMat(M*N,0);
然后创建一个将按元素访问元素的访问者:
dataType& getElement(int i, int j)
{
return MyMat[M*i+j];
}
这样您就可以获得最佳性能。当然,还有更多关于性能的细节,但这足以回答你的问题。
是的,你不应该自己做矩阵操作。在最好的情况下,如果你是一个专业的高性能开发人员,你应该使用一些LAPACK实现来为你做矩阵操作(就像Armadillo的那些人那样)。 / p>