2011-08-04 61 views
2

我正在研究这一小段代码,尽管它按照我的预期工作,但我需要对其进行优化。请给我建议一些想法。有没有办法优化这段代码?

这里是我的代码重要的一块:

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]。但是,很显然,这不是有效的代码,因为我可以有一个循环运行,并在一次拍摄两个作业。但是,这变成了C风格而不是C++。

有什么方法可以使用replace_if并且一举完成这两件事。

+1

如果您需要优化中,“C++看”不是一个说法了。 – moala

+0

@moala:完全不同意。这不是因为你需要优化你需要丑陋的原始迭代器代码。 C++风格甚至可能比你自己做得更好。这只是挑选正确工具的问题(正如答案中所显示的那样)。 – KillianDS

+0

@KillianDS:每个任务都没有工具,有时你必须建立你自己的任务专用工具。 – moala

回答

1

您可以随时使用transform,用适当的变压器,即:

struct Clipper 
{ 
    int operator()(int in) const 
    { 
     return in < 0 ? 0 : 4096 < in ? 4095 : in; 
    } 
}; 
+0

这是不可读的 – KillianDS

+0

@KillianDS:你可以用if()s写它,但它可能比std :: min(std :: max(0,value),4096)更优化,因为<0中的情况确实如此不会触发第二次比较。实际上,它可能只是因为处理单元的分支预测可能会干扰全局任务的执行。 – moala

+0

@moala:我实际上并没有抱怨实现,这是很好的imho,它是关于缺少()的。 – KillianDS

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); 
相关问题