第一个问题,如果我将在接下来的3年中开发代码,那么开始使用c ++ 11是一件好事吗?
如果是的话,如果我想在Lapack中使用它,那么实现矩阵的“最佳”方法是什么?我的意思是,做std::vector<std::vector< Type > > Matrix
并不容易与Lapack兼容。
到目前为止,我使用Type* Matrix(new Type[N])
存储了我的矩阵(带有new
和delete
的指针形式很重要,因为数组的大小不是像5这样的数字,但作为变量)。
但是使用C ++ 11可以使用std :: array。根据这个site,这个容器似乎是最好的解决方案......你怎么看?
答案 0 :(得分:18)
首先,如果您要学习C ++,请学习C ++ 11。之前的C ++标准于2003年发布,这意味着它已经十年岁。这在IT世界中很多。 C ++ 11技能也将顺利转换为即将推出的C ++ 1y(最可能是C ++ 14)标准。
std::vector
和std::array
之间的主要区别在于动态(大小和分配)和静态存储。因此,如果你想要一个总是比如4x4的矩阵类,std::array<float, 4*4>
就可以了。
这两个类都提供.data()
成员,它应该生成一个兼容的指针。但请注意,std::vector<std::vector<float>>
不会出现连续的16*sizeof(float)
内存(因此v[0].data()
不会工作)。如果您需要动态大小的矩阵,请使用单个vector
并将其调整为width*height
大小。
由于对元素的访问会更加困难(v[width * y +x]
或v[height * x + y]
),您可能希望提供一个包装类,允许您按行/列对访问任意字段。
既然你也提到了C风格的数组; std::array
提供了更好的界面来处理相同类型的存储,因此应该是首选;使用std::array
上的静态数组没有任何好处。
答案 1 :(得分:14)
这是对这个问题的回复很晚,但是如果有人读到这个,我只想指出一个人几乎不应该将矩阵作为矢量&#39;&#39;&#39;&#39;&#39; #39 ;.原因是矩阵的每一行都存储在堆上的某个随机位置。这意味着矩阵运算会进行大量随机存储器访问,从而导致缓存未命中,从而大大降低了实现速度。
换句话说,如果您完全关心性能,只需分配array/std::array/std::vector
大小rows * columns
,然后使用包装函数将一对整数转换为数组中的相应元素。除非你需要支持返回对矩阵行的引用之类的东西,否则所有这些选项应该可以正常工作。