当使用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