优雅高效地修改std::array的所有元素的方法

3
我想给存储在std :: array容器中的所有数据添加特定的偏移量:
std::array<double, 256> data;
ReadData(data);

// apply data offset
const double OFFSET = 0.123;
data += OFFSET;

可以使用例如 std::for_each 和 lambda 来完成。
std::for_each(data.begin(), data.end(), [=OFFSET](auto& n){ n += OFFSET; });

我在想是否有更优雅、更简洁、更高效的方法来实现这个。
3个回答

8
有时仅编写循环比其他任何方法都更清晰:
for (auto& n : data) n += OFFSET;

这肯定是有效的,但在我看来,+= 运算符更加优雅。不幸的是,标准库没有提供它。 - tommyk
@tommyk 我不确定你的意思是什么。 - TartanLlama
这个for循环可能非常高效,但在我看来并不优雅,因为它添加了样板代码(for循环)到我的简单意图中,即data += OFFSET - tommyk
如果std :: array有一个operator +=,我会直觉地认为它会连接数组,而不是执行逐个成员的+=。 - Ben Russell
1
如果你想要重载算术运算符,请看一下std::valarray - Ilya Popov

3
如果您并非严格绑定于std::array类型,您可以选择其他提供重载算术运算符的容器。
在标准库中有std::valarray,您可以编写以下代码:
std::valarray<double> data(256);
ReadData(data);

data += OFFSET;

如果您需要更多的操作,比如解线性方程组、插值等,可以使用完整的线性代数库,例如Eigen。 其他选择包括boost.ublasBlazeArmadilloMTL4等。

绝对是正确的选择。 - nbubis

0
我在想是否有一种更优雅、不那么冗长且高效的方法来实现这个问题。
在我看来,std::transformstd::for_each更加优美,因为它是正确的工具(std::for_each更通用)。 它比std::for_each更冗长,但不知道效率如何:
std::transform(data.begin(), data.end(), data.begin(), [=OFFSET](const double n){
    return n + OFFSET;
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接