16

第一个问题,如果我要为接下来的 3 年开发代码,那么开始使用 c++11 是一件好事吗?

那么如果是的话,如果我想将它与 Lapack 一起使用,那么实现矩阵的“最佳”方法是什么?我的意思是,做std::vector<std::vector< Type > > Matrix与 Lapack 不容易兼容。

到目前为止,我将我的矩阵存储为Type* Matrix(new Type[N])(指针形式newdelete很重要,因为数组的大小不是像 5 这样的数字,而是作为变量)。

但是对于 C++11,可以使用 std::array。根据这个网站,这个容器似乎是最好的解决方案......你怎么看?

4

2 回答 2

20

首先,如果您要学习 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() 不起作用)。如果您需要动态大小的矩阵,请使用 singlevector并将其调整为width*height大小。

由于对元素的访问会有点困难(v[width * y +x]v[height * x + y]),您可能希望提供一个包装类,允许您按行/列对访问任意字段。

由于您还提到了 C 风格的数组;std::array提供更好的接口来处理相同类型的存储,因此应该是首选;静态数组 over 没有任何好处std::array

于 2013-09-18T09:55:01.093 回答
16

这是对这个问题的一个很晚的答复,但如果有人读到这个,我只想指出,几乎不应该将矩阵实现为“向量的向量”。原因是矩阵的每一行都存储在堆上的某个随机位置。这意味着矩阵运算将执行大量随机内存访问,从而导致缓存未命中,从而大大减慢了实现速度。

换句话说,如果您完全关心性能,只需分配一个array/std::array/std::vectorsize rows * columns,然后使用将一对整数转换为数组中相应元素的包装函数。除非您需要支持诸如返回对矩阵行的引用之类的功能,否则所有这些选项都应该可以正常工作。

于 2015-07-12T19:53:12.013 回答