C ++ max_element每n个元素 [英] c++ max_element every n element

查看:43
本文介绍了C ++ max_element每n个元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有一种方法可以在容器中查找每N个元素进行比较的max元素并返回索引.使用STL,BOOST还是其他lib?

Is there a way to find the max element in a container comparing every N elements and return the index. Using STL, BOOST, or... another lib?

每N个,我的意思是使用std :: max_element,但是将for的增加量从++ first更改为first + = n;

with every N, I mean use the std::max_element, but change the increase in the for, from ++first, to first += n;

// based on std::max_element

#ifndef NEWTON_ALGORITHM_SEARCH_MAX_INDEX_HPP
#define NEWTON_ALGORITHM_SEARCH_MAX_INDEX_HPP

#include <iterator>

#include <newton/functional.hpp>

namespace newton {

  // SAME THAT STD::MAX_ELEMENT
  template<class ForwardIt, class Compare>
  const ForwardIt max_index(ForwardIt first, ForwardIt last, Compare comp)
  {

    if ( newton::equal(first, last) ) // newton::equal is basically equivalent to std::equal_to
      return last;

    ForwardIt largest = first;
    while ( newton::not_equal(++first, last) )
      if (comp(*largest, *first))
        largest = first;

    return largest;

  }

  // possible names
  // max_index_some
  // max_index_every_n
  // max_index__n

  template<class ForwardIt, class Size, class Compare>
  const ForwardIt max_index_every_n(ForwardIt first, ForwardIt last, Size n, Compare comp)
  {

    if ( newton::equal(first, last) )
      return last;

    ForwardIt largest = first;
    Size blocks = std::distance(first, last) / n; // integer blocks

    if ( newton::greater_equal(blocks, 1) ) {

      // if there are exacly N elements, can't sum example
      // v.size() = 10, first start in 0, so "0 += 10" is "10", but last index is "9"
      // but if mod >= 1, then index is at least 10, so can sum

      if ( newton::greater_equal( std::distance(first, last) % n, 1) ) {
        for (size_t i = 1; newton::less_equal(i, blocks); ++i, first += n) {

          if (comp(*largest, *first))
            largest = first;
        }
      }
      else {

        for (size_t i = 1; newton::less(i, blocks); ++i, first += n) {

          if (comp(*largest, *first))
            largest = first;
        }

      }

    }

    return largest;

  }

  template<class ForwardIt>
  const ForwardIt max_index(ForwardIt first, ForwardIt last)
  {
    return max_index(first, last, newton::structure::less());
  }
} // newton

如果没有,您尝试将其包含在下一个STL版本中的解决方案是什么.记住

if there is not, whats your solution to try to include it in a next STL version. remember

推荐答案

仅使用Boost(可以说是"Range V2"):

Using just Boost ("Range V2" so to speak):

在Coliru上直播

#include <boost/range/adaptors.hpp>
#include <boost/range/algorithm.hpp>
#include <boost/range/algorithm_ext.hpp>
#include <iostream>
#include <vector>

int main() {
    std::vector<int> v(100);
    boost::iota(v, 0);

    int n = 17;
    auto it = boost::max_element(v | boost::adaptors::strided(n));

    std::cout << "max: " << *it << "\n";
}

打印

max: 85

替代用法

您不必全部使用范围算法.您还可以根据需要选择:

Alternative Usage

You don't have to use range algorithms and all. You can also pick as you require:

在Coliru上直播

#include <boost/range/adaptor/strided.hpp>
#include <iostream>
#include <vector>

int main() {
    std::vector<int> v { 1,2,3,4,5,6,7,8,9,10 };

    auto v_ = boost::adaptors::stride(v, 7);
    auto it = std::max_element(v_.begin(), v_.end());

    std::cout << "max: " << *it << "\n";
}

打印

max: 8

这篇关于C ++ max_element每n个元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆