C++ c++;最小元素

C++ c++;最小元素,c++,stl,C++,Stl,我想找到数组中的最小元素,但是如果最小元素出现了多次,那么我想要元素的最后一次出现。我将std::min_element()与我的comp()函数一起使用 vector<int>::iterator it=min_element(input.begin(), input.end(),comp); cout << *it << endl; cout << distance(input.begin(), it); bool comp(int a, i

我想找到数组中的最小元素,但是如果最小元素出现了多次,那么我想要元素的最后一次出现。我将
std::min_element()
与我的
comp()函数一起使用

vector<int>::iterator it=min_element(input.begin(), input.end(),comp);
cout << *it << endl;
cout << distance(input.begin(), it);

bool comp(int a, int b) {
if (a <= b)
    return true;
else
    return false;
}
vector::iterator it=min_元素(input.begin(),input.end(),comp);

不能给出
min\u元素
反向迭代器:

vector<int>::reverse_iterator it=min_element(input.rbegin(), input.rend(),comp);
vector::reverse\u迭代器it=min\u元素(input.rbegin(),input.rend(),comp);
然后,如果需要,将它转换回“普通”迭代器


别忘了校正你的比较仪;它必须是
如果您的数据存储在
向量中,那么使用反向迭代器就足够了,正如前面所建议的那样

一般来说,标准库不提供
min\u element\u last
函数,如中所述。在这方面,
min\u element\u last
的可能实现可以是:

template <typename I>
using ValueType = typename std::iterator_traits<I>::value_type;

template <typename I, typename R>
// I models ForwardIterator
// R models StrictWeakOrdering on ValueType<I>
I min_element_last(I first, I last, R cmp) {
    if (first == last) return last;
    I curr = first;
    ++first;
    while (first != last) {
        if (!cmp(*curr, *first)) {
            curr = first;
        }
        ++first;
    }
    return curr;
}

template <typename I>
// I models ForwardIterator
// ValueType<I> models TotallyOrdered
I min_element_last(I first, I last) {
    using T = ValueType<I>;
    return min_element_last(first, last, std::less<T>());
}
模板
使用ValueType=typename std::iterator\u traits::value\u type;
样板
//我是一个迭代器
//基于ValueType的R模型
I最小元素最后(I第一,I最后,R cmp){
如果(first==last)返回last;
I curr=第一;
++第一,;
while(第一个!=最后一个){
如果(!cmp(*当前,*第一个)){
curr=第一;
}
++第一,;
}
返回货币;
}
样板
//我是一个迭代器
//ValueType模型总计订购
I minu_element_last(I first,I last){
使用T=ValueType;
返回minu元素_last(first,last,std::less());
}

这样做的好处是可以将
min\u element\u last
与只对ForwardIterator概念建模的迭代器一起使用

您可能会滥用,其中返回的最后一个最大元素与
std::max_元素
相反:

auto last_min_it = std::minmax_element(input.begin(), input.end(), std::greater<>{}).second;

只需在反向迭代器上应用
min_元素
;您将免费获得最后一次出现。
comp
不满足严格弱排序的要求。因此,您的程序表现出未定义的行为。
if(a@PaulMcKenzie)正在研究可能的实现,它实际上应该可以工作,但它不满足比较要求。有趣的问题是,将此comparator要求放在这里是一个好主意吗case@Slava“研究可能的实施,它实际上应该是可行的”危险的想法。就在前几周,当有人认为一个坏了的比较器应该是好的,因为他们个人将如何实现稳定排序时,我不得不消除这种想法!很自然,它会崩溃。总是按照合同编码,句号!@RohitPandit,因为这不是你的比较器所期望的含义。它不能只做“任何事情”它需要做标准所期望的事情。
auto min_rev_it = std::min_element(input.rbegin(), input.rend());