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

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

本文关键字:vs array std vector static c++11      更新时间:2023-10-16

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

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

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

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

首先,如果你要学习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上没有任何好处。

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

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