首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >c++11 std::array vs静态数组vs std::vector

c++11 std::array vs静态数组vs std::vector
EN

Stack Overflow用户
提问于 2013-09-18 17:42:43
回答 2查看 21.2K关注 0票数 16

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

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-18 17:55:01

如果你想学习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相比,使用静态数组没有什么好处。

票数 20
EN

Stack Overflow用户

发布于 2015-07-13 03:53:12

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

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

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18868860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档