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

时间:2013-09-18 09:42:43

标签: c++ arrays c++11 matrix lapack

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

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

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

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

2 个答案:

答案 0 :(得分:18)

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

std::vectorstd::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,然后使用包装函数将一对整数转换为数组中的相应元素。除非你需要支持返回对矩阵行的引用之类的东西,否则所有这些选项应该可以正常工作。