我有以下函数来计算两个笛卡尔点之间的距离,以及关于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
有什么好处,还是有更好的方法来替换向量中的最后一个元素?
答案 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
。