- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用类型std::valarray<std::valarray<double>>
并希望对每个包含的 valarrays 元素进行求和,留下 std::valarray<double>
.
C++ 文档指出运算符 .sum() 可以应用于 std::valarray<T>
只要运算符(operator)+=
是为类型 T 定义的。下面的代码(方法 1)尝试将此应用于 std::valarray<std::valarray<double>>
,但结果似乎是无稽之谈。
但是,如果我使用 +=
手动执行此操作运算符(方法2),我得到了我想要的结果。但 method2 有效的事实似乎暗示运算符 +=
为类型 std::valarray<double>
定义,因此该 method1 使用 .sum()。应该管用。我真的不明白这里发生了什么......
我的代码:
#include <iostream>
#include <valarray>
// Attempt to use .sum() operator
std::valarray<double> method1(const std::valarray<std::valarray<double>>& data) {
return data.sum();
}
// Manual summation using += operator
std::valarray<double> method2(const std::valarray<std::valarray<double>>& data) {
std::valarray<double> sum(data[0].size());
for (size_t i{0}; i < data.size(); i++) {
sum += data[i];
}
return sum;
}
// Display size and elements
void showData(const std::valarray<double> data) {
std::cout << "Size = " << data.size() << "\n";
std::cout << "Data = ";
for (size_t i{0}; i < data.size(); i++) {
std::cout << data[i] << " ";
}
std::cout << "\n\n";
}
int main() {
std::valarray<std::valarray<double>> data{{1,2},{3,4}};
showData(method1(data));
showData(method2(data));
}
我的输出:
Size = 0
Data =
Size = 2
Data = 4 6
最佳答案
sum
方法std::valarray
需要operator+=
为其值类型定义(在您的情况下为 std::valarray
),但是 std::valarray
还要求它是默认可构造的(来自“数字”概念要求)。这允许 sum
无需 operator+
即可工作的方法,首先默认构造一个元素,然后添加每个包含的元素 operator+=
.
虽然它没有在任何地方定义,但据我所知,它的工作原理可能是这样的。
T sum() const {
T result;
for (auto& it : elements) {
result += it;
}
return result;
}
valarrays 的 valarray ( std::valarray<std::valarray>
) 的问题是默认构造的 valarray 为空。当 operator+=
与空 valarray 和非空 valarray 一起应用,会导致未定义的行为 ( "The behavior is undefined if size() != v.size()
" )。您可能会得到一个空的 valarray 结果(但您可能会得到任何东西)。
您可以使用 std::accumulate
。它需要一个初始值作为第三个参数,这可以解决这个问题。
std::accumulate(std::begin(data), std::end(data), std::valarray<double>(data[0].size()))
PS:别问我为什么std::valarray
没有办法begin
和end
.
关于c++11 - 在 std::valarray<T> 上使用 .sum() 和 +=,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48854525/
是的,这个has been asked before ,答案是: valarrays (value arrays) are intended to bring some of the speed of
看完这篇http://gcc.gnu.org/ml/libstdc++/2000-q1/msg00123.html ,似乎标准不能保证使用 valarrays 的 valarrays 是安全的。但是当
STL 中valarray::min 和valarray::max 函数的时间复杂度是多少? 此外,什么是查找各种其他 STL 组件的时间/空间复杂性的良好来源? 最佳答案 O(N) 这些函数不会缓存
这是我在这里的第一篇文章,但我经常阅读这里的各种主题。 现在我被 c++ 的编程问题困住了,它基本上是一个名为“Pair”的模板类,它应该包含 2 个 valarrays 的整数,然后包含在另一个名为
出于兼容性目的,我正在开发一个具有 C 接口(interface)的库 void interface(double* context, size_t num_elements); 而 context
我有一些数据存储在 std::vector 中.我用它来创建一个 std::valarray来 self 的 std::vector . std:valarray corpX(corps_tmp[i]
当我将 valarray 除以它的第一个元素时,只有第一个元素变为 1,其他元素保持其原始值。 #include #include using namespace std; int main()
为什么 std::valarray 不支持自定义分配器?它的内存管理是怎么设计的?是否使用了基于new 或malloc 的分配器?所有其他容器通常都提供指定自定义分配器的可能性。比如说,libstdc
valarray 是否有连续内存对齐? 我想通过传递 &myValarray[0] 将一个 valarray 传递给一个只接受指针的函数(来自 IPPS)。但因此我应该确定,valarray 的内存对
以下程序: #include #include using namespace std; int main() { int init[] = {1, 1}; // Example 1 va
当我用 valarray 写一个简单的算术表达式时并将结果分配给 auto当我尝试在 gcc 上访问结果时出现段错误。 #include #include using std::ostream;
std::valarray myArray(3)产生 valarray长度为 3,初始化为零。 std::valarray myArray(1,3)产生 valarray长度为 3,初始化为 1。 s
我们可以初始化一个valarray来自基本的用户定义数组,如下所示: int arr[3]={0}; valarray test(arr, sizeof(arr)/sizeof(int)); 我们怎样
在下面的类中,当我尝试为 operator [] 返回 std::valarray& 时,它说:invalid initialization of std::valarray& from R - 值引
我发布了一个用 C++ 编写的简单的 n-body 类 here在代码审查中。 我被告知要使用 std::valarray 而不是普通的 std::array ,目的是我可以重写一些目前看起来像这样的
我在一个列表中有很多数据,比如每个元素有几千字节,我想逐个提取以进行一些数字处理。这些数据最初存储为 float[]。由于处理涉及大量索引和全局计算,我认为 valarray 可能易于编程。但是如果我
您好,我想构建一个辅助类来初始化一个 STL valarray。我想要的是执行以下操作: std::valarray vec(3); vlist_of(vec)(2)(3)(5); 所以我可以只使用一
我正在寻找静态大小的 std::valarray 实现。 我自己实现应该很容易,但我需要 constexpr 操作(加法、减法等),这有点无聊/容易出错,所以我在这里问一下是否有流行的实现。 如果我必
代码: #include #include using namespace std; int main() { valarray v0(2, 4); valarray v1; v
这可能是个愚蠢的问题。 关于 this我读过的网站 The valarray specification allows for libraries to implement it with sever
我是一名优秀的程序员,十分优秀!