2014-10-29 43 views
2

我認爲以下方法可行,但它只輸出零。想法?找到兩個向量之間的最大元素

std::vector<int> a = { 1, 2, 3 }; 
std::vector<int> b = { 4, 5, 6 }; 

int max = *std::max(std::max(a.begin(), a.end()), std::max(b.begin(), b.end())); 
std::cout << max; 
+5

請閱讀'std :: max'的文檔。它不需要範圍。 – chris 2014-10-29 13:04:33

+3

改爲查看['std :: max_element'](http://en.cppreference.com/w/cpp/algorithm/max_element)。 – 2014-10-29 13:06:16

+0

@約瑟夫很棒的資源! – user4194178 2014-10-29 13:08:58

回答

9

您使用的是std::max,它比較了它的參數。也就是說,它返回兩個迭代器中較大的一個。

要用於內部調用什麼是std::max_element,其中發現的最大元素的範圍:

std::vector<int> a = { 1, 2, 3 }; 
std::vector<int> b = { 4, 5, 6 }; 

int max = std::max(*std::max_element(a.begin(), a.end()), *std::max_element(b.begin(), b.end())); 
std::cout << max; 

Live example

由於@MikeSeymour正確的評論中指出,上面的代碼假設範圍不是空的,因爲它無條件地解引用從std::max_element返回的迭代器。如果其中一個範圍是空的,則返回的迭代器將是過去最後一個,不能解除引用。

+3

雖然在這個例子中這不是問題,但在解引用迭代器之前,您需要確保範圍非空。 – 2014-10-29 13:17:30

+0

@MikeSeymour對,提到。 – Angew 2014-10-29 13:23:14

0
int m = std::max(std::max_element(a.begin(), a.end()), std::max_element(b.begin(), b.end())); 

這找到了各個向量的最大值的最大值。例如,對於第一個向量{1,2,3},最大值爲3,對於第二個向量{4,5,6},最大值爲6,最大值爲3並且現在爲6 6

+1

你可以給你的代碼添加一些解釋嗎? – msrd0 2014-10-29 13:33:04

3

這是一種以空白範圍表現明智的方式。如果任何一個範圍是空的,您仍然可以從另一個範圍獲得最大值。如果兩個範圍均爲空,則您獲得INT_MIN

int m = std::accumulate(begin(b), end(b), 
      std::accumulate(begin(a), end(a), INT_MIN, std::max<int>), 
      std::max<int>); 

std::accumulate是更好地在這裏,因爲你想要的值,而不是一個迭代器,作爲結果。

+0

這段代碼是如何工作的? – user4194178 2014-10-29 13:53:33

相關問題