【问题标题】:Elegant and efficient way to modify all elements of std::array修改 std::array 的所有元素的优雅而有效的方法
【发布时间】:2015-11-23 11:04:13
【问题描述】:

我想为存储在 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; });

我想知道是否有更优雅、更少冗长和更有效的方法来实现这一点。

【问题讨论】:

    标签: arrays c++11 foreach lambda


    【解决方案1】:

    有时只写循环比什么都清楚:

    for (auto& n : data) n += OFFSET;
    

    【讨论】:

    • 这绝对是有效的,但 += 运算符恕我直言更优雅。不幸的是,std 没有提供。
    • @tommyk 我不确定你的意思。
    • 这个 for 循环可能非常有效,但恕我直言,它并不优雅,因为它将样板代码(for 循环)添加到我的简单意图 data += OFFSET
    • @tommyk 如果 std::array 有一个运算符 += 我会直观地假设它连接数组,而不是执行成员明智的 +=。
    • @tommyk 如果您想要重载算术运算符,请查看std::valarray
    【解决方案2】:

    如果您没有严格绑定std::array 类型,您可以选择其他提供重载算术运算符的容器。

    在标准库中有std::valarray,你可以在其中写:

    std::valarray<double> data(256);
    ReadData(data);
    
    data += OFFSET;
    

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

    【讨论】:

    • 绝对是要走的路。
    【解决方案3】:

    我想知道是否有一种更优雅、不那么冗长和有效的方法来实现这一点。

    在我看来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;
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 2011-08-06
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多