STL提供std::max_element
来查找可迭代的最大元素,例如像这样:
std::vector<float>::const_iterator max =
std::max_element(obj.pt()->begin(), obj.pt()->end());
return std::distance(obj.pt()->begin(), max);
还有第n个最大元素可以得到迭代器的东西吗?
(请注意
max_element
返回一个迭代器,这实际上很重要:我不是在寻找值本身,而是在迭代器中寻找第n个最大元素的位置。) 最佳答案
如果您对第二大元素特别感兴趣,则可以对数组进行简单扫描,其中大多数元素需要进行一次比较:
float second_largest_element(std::vector<float> vec) {
float m2, m1;
/* Check to make sure that vec has at least 2 elements!! */
std::tie(m2, m1) = std::minmax(vec[0], vec[1]);
for (auto it = vec.begin() + 2, limit = vec.end();
it != limit;
++it)
if (*it > m2) std::tie(m2, m1) = std::minmax(*it, m1);
return m2;
}
尽管
std::minmax
不太有用,但获取第二大元素的索引(或对其进行迭代)非常相似。这是一个很草率的例子:template<typename T>
typename T::iterator second_largest(T& container) {
using iterator = typename T::iterator;
iterator limit = container.end();
iterator it = container.begin();
if (it != limit) {
iterator first = it++;
if (it != limit) {
iterator second = it++;
if (*first < *second) std::swap(first, second);
for (; it != limit; ++it) {
if (*second < *it) {
if (*first < *it) { second = first; first = it; }
else { second = it; }
}
}
return second;
}
return first;
}
return it;
}
您也可以考虑使用
std::accumulate
扫描数组,尽管显式的for循环并不复杂。关于c++ - std::max_element用于第二大元素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30488586/