2014-11-24 40 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; 
}