gpt4 book ai didi

c++11 - 在 std::valarray 上使用 .sum() 和 +=

转载 作者:行者123 更新时间:2023-12-03 00:01:12 24 4
gpt4 key购买 nike

我正在使用类型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()))

Live on Coliru.

PS:别问我为什么std::valarray没有办法beginend .

关于c++11 - 在 std::valarray<T> 上使用 .sum() 和 +=,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48854525/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com