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