[英]c++ STL min_element
我想在数组中找到最小元素,但是如果最小元素出现多次,那么我希望该元素的最后一次出现。 我在我的comp()
函数中使用了std::min_element()
。
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;
}
该代码给出错误,表明输入3 3 4上的比较器无效。
给min_element
反向迭代器:
vector<int>::reverse_iterator it=min_element(input.rbegin(), input.rend(),comp);
然后将其转换it
当且仅当你需要恢复到“正常”的迭代器。
并且不要忘记校正您的比较器; 它必须是<
not <=
。
您可能会滥用 std::minmax_element
,它返回与std::max_element
相反的最后一个最大元素:
auto last_min_it = std::minmax_element(input.begin(), input.end(), std::greater<>{}).second;
我可能会在std::min_element
使用反向迭代器:
auto min_rev_it = std::min_element(input.rbegin(), input.rend());
如果您的数据存储在vector
,则已经建议使用反向迭代器就足够了。
更一般地,标准库不提供min_element_last
函数,如1中所述 。 在这方面, min_element_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>());
}
优点是可以将min_element_last
与仅对ForwardIterator概念建模的迭代器一起使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.