C++11:我应该使用 valarray 还是 vector 进行数值计算

Posted

技术标签:

【中文标题】C++11:我应该使用 valarray 还是 vector 进行数值计算【英文标题】:C++11: should I use valarray or vector for numerical computing 【发布时间】:2017-04-24 07:37:11 【问题描述】:

vector vs valarray 的问题已经被问到here。 我的问题专门针对 C++11 的情况。我一直在阅读"A Tour of C++" 和"The C++ Programming Language"。这两本书均由 Bjarne Stroustrup 撰写。在第一本书中,作者解释说,std::valarray 应该是数值计算的首选(第 12 章)。但是在第二本书的第 29 章中,作者根据 std::vector 实现了一个 Matrix 类。

另外,通过做一些googling,似乎在性能方面,std::vector 与动态分配的“原始数组”一样快。

那么在 C++11 的上下文中,数值计算应该首选哪个容器?

我对此的看法是,因为std::vector 使用operator[] 提供对其内容的快速访问(它返回对数据的引用而不进行边界检查)并且使用std::vector 也更安全在动态分配的数组上,std::vector 应该是首选。 此外,从 C++11 开始:

std::vector 使用 std::vector::data() 提供对基础数据的直接访问 std::vector 可以使用std::vector::shrink_to_fit() 调整大小以使用更少的内存

【问题讨论】:

你为什么不测量和验证哪个会更快。在现代 C++ 世界中,std::vector 应该用作默认容器,除非我们有理由不这样做。 【参考方案1】:

valarray 有很好的functionality,您可以轻松地逐元素应用数学函数,并且您具有更好的切片能力。你可以例如做v3 = sin(v2 + v1*3)

不过,如果你真的想做科学计算,可以考虑使用 Eigen 之类的库

【讨论】:

我知道 Eigen、Armadillo、MTL4 以及许多其他矩阵库。这些库的问题之一是它们的源代码是完全不透明的(换句话说,作为一个学习工具很难,或者如果我想自己改变一些东西)。我的问题也更多是基于概念的。我的理解是 std::valarray 是“未完成的事业”

以上是关于C++11:我应该使用 valarray 还是 vector 进行数值计算的主要内容,如果未能解决你的问题,请参考以下文章

std::valarray 和 std::array 有啥区别

C++11 清除shared_ptr时,我应该使用reset还是设置为nullptr?

将 std::vector 分配给 std::valarray

如何比较 C++ slice_array?为啥不能将其与 valarray 进行比较?

valarray vs. vector:为啥要引入 valarray?

20.计算速度最快的valarray