获取std :: min_element和std :: max_element以将迭代器返回到最后一个值?

时间:2015-01-05 11:08:34

标签: c++

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

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

3 个答案:

答案 0 :(得分:10)

您不必编写自己的数据结构,可以使用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;

答案 1 :(得分:1)

只考虑最后一个最大的元素std::minmax_element,它返回:

  

一对由最小元素的迭代器组成的对   元素和最大元素的迭代器作为第二个元素。返回   如果范围为空,则std :: make_pair(first,first)。如果好几个   元素相当于最小元素,即迭代器   首先返回这样的元素。 如果有几个元素相当于   最大的元素,最后一个元素的迭代器是   返回。

答案 2 :(得分:0)

您可以使用自己的谓词:

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);