當使用std::min_element
和std::max_element
時,如果範圍中多於一個元素是最低/最高,則返回的迭代器指向第一個這樣的元素。不過,我需要指出最後一個這樣的元素。如果不編寫自己的函數或反轉輸入數據結構,我該怎麼做?獲取std :: min_element和std :: max_element以將迭代器返回上一個值?
我的輸入數據結構是一個C數組如int data[N]
和C++ 11或升壓不可用(不是我的選擇..)
當使用std::min_element
和std::max_element
時,如果範圍中多於一個元素是最低/最高,則返回的迭代器指向第一個這樣的元素。不過,我需要指出最後一個這樣的元素。如果不編寫自己的函數或反轉輸入數據結構,我該怎麼做?獲取std :: min_element和std :: max_element以將迭代器返回上一個值?
我的輸入數據結構是一個C數組如int data[N]
和C++ 11或升壓不可用(不是我的選擇..)
你不必寫自己的數據結構,您可以使用std::reverse_iterator
:
typedef std::reverse_iterator<int*> Rev;
std::size_t idx = Rev(data) - std::max_element(Rev(data + N), Rev(data)) - 1;
或者,如果你想要的指針:
int *p = std::max_element(Rev(data + N), Rev(data)).base() - 1;
指針代碼中我不需要-1嗎? –
@NeilKirk哎呀,你顯然是這樣做的。修復答案,謝謝。 – Angew
您可以用您自己的斷言:
struct LessWithOrder
{
bool operator() (const int& lhs, const int& rhs) {
return lhs != rhs ? lhs < rhs : &lhs < &rhs;
}
};
struct LessWithInvOrder
{
bool operator() (const int& lhs, const int& rhs) {
return lhs != rhs ? lhs < rhs : &lhs > &rhs;
}
};
然後
it = std::min_element(data, data + N, LessWithInvOrder);
it = std::max_element(data, data + N, LessWithOrder);
只考慮最後的最大元素有已經std::minmax_element
,它返回:
一對組成的迭代器作爲第一個元素作爲最小元素,迭代器作爲第二個元素作爲最大元素。如果範圍爲空,則返回 std :: make_pair(first,first)。如果幾個 元素相當於最小的元素,則返回到第一個這樣的元素的迭代器。 如果幾個元素相當於 最大的元素,則返回最後一個元素的迭代器 。
當使用std :: max_element和std :: max_element時??錯字 – Ankur
@Angew你可以給一個代碼示例使用C風格的數組?謝謝。 –
[查找最大索引的最大元素在數組中](http://stackoverflow.com/questions/27713281/c-finding-the-largest-index-of數組中最大的元素) – Jarod42