c ++ 11 std :: array vs static array vs std :: vector

Pin*_*oyd 15 c++ arrays matrix lapack c++11

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

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

到目前为止,我存储了我的矩阵Type* Matrix(new Type[N])(指针形式带有new并且 delete很重要,因为数组的大小不是像5那样的数字,而是作为变量).

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

Bar*_*icz 18

首先,如果您要学习C++,请学习C++ 11.之前的C++标准于2003年发布,这意味着它已经有十年历史了.这在IT世界中很多.C++ 11技能也将顺利转换为即将推出的C++ 1y(最可能是C++ 14)标准.

std::vector和之间的主要区别std::array是动态(大小和分配)和静态存储.因此,如果你想拥有一个总是比如4x4的矩阵类,那就std::array<float, 4*4>行了.

这两个类都提供了.data()member,它应该生成一个兼容的指针.但请注意,这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.

  • `std :: vector`由于其动态特性而具有(非常轻微的)性能影响; 因为在编译时不知道所需内存的大小,所以必须进行OS内存分配调用.C风格的数组和`std :: array`是固定大小的OTOH,因此它们可以在堆栈上分配,而无需向OS请求更多内存.在两种方法中对元素的访问同样快,归结为简单的指针算法.如果您认真对待性能,则应该使用SIMD指令和类型来使用硬件加速计算. (4认同)

Edv*_*olm 15

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

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