我正在研究这一小段代码,虽然它按照我的预期工作,但我需要对其进行优化。请给我一些想法。
这是我的代码的重要部分:
std::replace_if(inputImage,inputImage+ m_xDim*m_yDim*m_zDim, bind2nd(std::less<float>(), 0), 0); // replace the values <0 with 0 of array input
std::replace_if(inputImage,inputImage+ m_xDim*m_yDim*m_zDim, bind2nd(std::greater<float>(), 4095), 4095); // replace the values >4095 with 4095 of array input
正如您所看到的,我将inputImage的值设置为[0,4095]。但是,很明显,这不是有效的代码,becoz我可以循环运行并且一次性完成这两项工作。但是,这变成了C风格而不是C ++。
有没有办法使用 replace_if 并一次性完成这两件事。
答案 0 :(得分:4)
float clip(float value) {
return std::min(std::max(0, value), 4096);
}
int size = m_xDim * m_yDim * m_zDim;
std::transform(inputImage, inputImage + size, inputImage, clip);
答案 1 :(得分:1)
您始终可以使用transform
和适当的变压器,即:
struct Clipper
{
int operator()( int in ) const
{
return in < 0 ? 0 : 4096 < in ? 4095 : in;
}
};