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/

10-11 22:47
查看更多