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

Posted

技术标签:

【中文标题】valarray vs. vector:为啥要引入 valarray?【英文标题】:valarray vs. vector: Why was valarray introduced?valarray vs. vector:为什么要引入 valarray? 【发布时间】:2012-09-25 10:01:11 【问题描述】:

是的,这个has been asked before,答案是:

valarrays(值数组)旨在将 Fortran 的一些速度带入 C++。您不会创建valarray 的指针,因此编译器可以对代码做出假设并更好地优化它。 (Fortran这么快的主要原因是没有指针类型,所以不能有指针别名。)

或:

valarray 也应该消除任何混叠的可能性 [...]

但这些答案对我来说毫无意义。

valarrayvector类模板,因此,它们甚至在实例化之前存在。 当然,vector<int> 不会像 valarray<int> 那样引起别名问题。

鉴于此,valarray 的目的是什么,为什么他们不简单地将相同的功能放入 vector 中?

【问题讨论】:

Valarray 是 STL 的一个半生不熟的功能。目标是提供一个数组类,可以在其中批量执行操作,并在有意义的机器上进行循环融合。现在对 C++ 更有用的是Intel ABB。 根据 H. Sutter 的说法,这是 C++98 标准最终确定之前 STL 之前的遗留物。参见例如gotw.ca/publications/mill01.htm 【参考方案1】:

关注点分离? vectorvalarray 解决不同的问题。引用标准,vector 是 (§23.3.6.1 [vector.overview] p1)

... 支持随机访问迭代器的序列容器。此外,它还支持(摊销)恒定时间的最后插入和擦除操作;在中间插入和擦除需要线性时间。存储管理是自动处理的,但可以给出提示以提高效率。

valarray 是 (§26.6.2.1 [template.valarray.overview] p1)

... 一维智能数组,元素从零开始按顺序编号。 它是一组有序值的数学概念的表示。 计算索引的熟悉习语以及广义下标运算符提供的强大子集功能可能会产生更高维度的错觉.

如您所见,它们有不同的用途。 vector 是一个广义的动态数组,而valarray 表示一组值。它也不能调整大小,只能分配。

【讨论】:

valarray 可以调整大小(但其内容可能会丢失)en.cppreference.com/w/cpp/numeric/valarray/resize【参考方案2】:

valarray 有分片机制

valarray 预计将使用其数值运算符的表达式模板来实现

【讨论】:

以上是关于valarray vs. vector:为啥要引入 valarray?的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 std::vector 传递到 std::valarray 的最有效方法

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

为啥捕获 lambda 不能应用于 std::valarray?

为啥 std::valarray 不是算术的?

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

将 valarray 转换为向量而不复制