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

Big*_*ion 10 c++11 valarray

这里已经提到了vector vs valarray的问题.我的问题专门针对C++ 11的情况.我一直在阅读"C++之旅""C++编程语言".这两本书都是由Bjarne Stroustrup撰写的.在第一本书中,作者解释说std::valarray应该首选数值计算(第12章).但是在第二章的第29章中,作者用a实现了一个Matrix类std::vector.

通过谷歌搜索,似乎在性能方面,a 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()

yar*_*yar 3

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

不过,如果您真的想做科学计算,请考虑使用Eigen等库

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