获取 std::min_element 和 std::max_element 到 return 迭代器到最后一个值?

Get std::min_element and std::max_element to return iterator to last value?

当使用 std::min_elementstd::max_element 时,如果范围内有多个元素是 lowest/highest,则返回的迭代器指向第一个这样的元素。但是我需要它指向最后一个这样的元素。不自己写函数,不反转输入数据结构,怎么办?

我的输入数据结构是 C 风格的数组,例如 int data[N] 并且 C++11 或 Boost 不可用(不是我的选择..)

不用自己写数据结构,可以用std::reverse_iterator:

typedef std::reverse_iterator<int*> Rev;
std::size_t idx = Rev(data) - std::max_element(Rev(data + N), Rev(data)) - 1;

[Live example]

或者,如果你想要指针:

int *p = std::max_element(Rev(data + N), Rev(data)).base() - 1;

您可以使用自己的谓词:

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 ,即 returns:

a pair consisting of an iterator to the smallest element as the first element and an iterator to the greatest element as the second. Returns std::make_pair(first, first) if the range is empty. If several elements are equivalent to the smallest element, the iterator to the first such element is returned. If several elements are equivalent to the largest element, the iterator to the last such element is returned.