我認爲以下方法可行,但它只輸出零。想法?找到兩個向量之間的最大元素
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;
我認爲以下方法可行,但它只輸出零。想法?找到兩個向量之間的最大元素
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;
您使用的是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;
由於@MikeSeymour正確的評論中指出,上面的代碼假設範圍不是空的,因爲它無條件地解引用從std::max_element
返回的迭代器。如果其中一個範圍是空的,則返回的迭代器將是過去最後一個,不能解除引用。
雖然在這個例子中這不是問題,但在解引用迭代器之前,您需要確保範圍非空。 – 2014-10-29 13:17:30
@MikeSeymour對,提到。 – Angew 2014-10-29 13:23:14
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
你可以給你的代碼添加一些解釋嗎? – msrd0 2014-10-29 13:33:04
這是一種以空白範圍表現明智的方式。如果任何一個範圍是空的,您仍然可以從另一個範圍獲得最大值。如果兩個範圍均爲空,則您獲得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
是更好地在這裏,因爲你想要的值,而不是一個迭代器,作爲結果。
這段代碼是如何工作的? – user4194178 2014-10-29 13:53:33
請閱讀'std :: max'的文檔。它不需要範圍。 – chris 2014-10-29 13:04:33
改爲查看['std :: max_element'](http://en.cppreference.com/w/cpp/algorithm/max_element)。 – 2014-10-29 13:06:16
@約瑟夫很棒的資源! – user4194178 2014-10-29 13:08:58