2014-11-24 82 views
0

我想查找两个变量绝对值的最大值,并返回该变量的实际值,而不是该变量的绝对值。返回变量绝对值最大值的实际值

例如:

int x = 3; 
int y = -5; 
int z = max(abs(x), abs(y)) 

会刚刚成立z5,而我希望它返回-5。有没有一个C++函数来执行此操作?

+1

写你自己的,这并不难。 – 2014-11-24 20:18:36

+3

不太可能,因为这是非常具体的。为什么不简单地'z =(abs(x)> abs(y))? x:y'? (请注意,这两个版本都不适用于'INT_MIN',尽管...) – 2014-11-24 20:18:44

+0

我怀疑是否有一个已经可用的标准函数,但是什么阻止你编写自己的?实现使用两对迭代器和'std :: max_element'似乎相当简单。 – 2014-11-24 20:18:45

回答

3
int z = (max(abs(x), abs(y)) == abs(x)) ? x : y; 

这就像if条件。它相当于

int z = x; 
if(max(abs(x), abs(y)) != abs(z)) 
    z = y; 

但是要短得多。

在STL中没有功能直接适应您的需求,所以您需要制作属于自己的这一个可以是一个版本。

更方便的可以是int z = (abs(y) < abs(x)) ? x : y想法。

+2

为什么这是downvoted?当然,它可以用一些更多的文字来解释它,但没有什么**错误**。 +1 – OMGtechy 2014-11-24 20:27:33

+1

@OMGtechy我没有downvote,但是'max(abs(x),abs(y))== abs(x)'是一种不必要的冗长而复杂的写入abs(x)> abs(y )' – 2014-11-24 20:38:05

1

如果您使用C++ 11,与STL,你可以使用int的vectormax_element和拉姆达Compare

std::vector<int> values = {3, -5}; 
int largest_abs = *std::max_element(values.begin(), values.end(), [](const int& a, const int& b) 
{ 
    return abs(a) < abs(b); 
}); 

这返回的开始和结束values,他们之间的迭代器绝对值是最大的。 (这是通过比较发现)的*然后使用迭代器(由std::max_element返回)转换为int

3

这不是一个常用的功能,不过,自己写的功能实在是微不足道。

int max_abs(int x, int y) 
{ 
    if (x == INT_MIN || y == INT_MIN) 
     return INT_MIN; 
    return (abs(x) > abs(y)) ? x : y; 
}