矢量pop_back

时间:2017-09-27 20:37:22

标签: c++ vector

我有以下函数来计算两个笛卡尔点之间的距离,以及关于z轴的一个点的镜像。

inline std::vector< Real64 >
distances(
    MyCartesian const & point_i,
    MyCartesian const & point_j
)
{
    std::vector< Real64 > sumVals;

    // Calculate the distance between points
    sumVals.push_back( pow_2( point_i.x - point_j.x ) );
    sumVals.push_back( pow_2( point_i.y - point_j.y ) );
    sumVals.push_back( pow_2( point_i.z - point_j.z ) );

    Real64 sumTot = 0;
    std::vector< Real64 > retVals;
    std::for_each( sumVals.begin(), sumVals.end(), [&] ( Real64 n ) { sumTot += n; } );
    retVals.push_back( std::sqrt( sumTot ) );

    // Calculate distance to mirror point
    sumVals.pop_back();
    sumVals.push_back( pow_2( point_i.z - ( -point_j.z ) ) );
    sumTot = 0;
    std::for_each( sumVals.begin(), sumVals.end(), [&] ( Real64 n ) { sumTot += n; } );
    retVals.push_back( std::sqrt( sumTot ) );

    return retVals;
};

pop_back,然后push_back有什么好处,还是有更好的方法来替换向量中的最后一个元素?

1 个答案:

答案 0 :(得分:3)

在我看来,使用矢量会让它过于复杂。

编写可以使用的距离函数 像这样:

Real64 distance(MyCartesian const & i, MyCartesian const & j)
{
    return std::sqrt(pow_2(i.x - j.x)
                   + pow_2(i.y - j.y)
                   + pow_2(i.z - j.z));
}

MyCartesian mirror(MyCartesian pt)
{
    pt.z *= -1;
    return pt;
}

std::vector<Real64>
distances(MyCartesian const & i,
          MyCartesian const & j)
{
    return std::vector { distance(i, j), distance(i, mirror(j)) };
}

由于始终只有两个结果,您可能更愿意返回pair而不是vector