Найти минимальное значение пользовательского типа данных с помощью заголовка алгоритма - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть вектор QPointF, и мне нужно найти минимальное и максимальное значения y, потому что мне нужно знать, какова амплитуда данных в векторе.

Я использую QPointF, нодля добавления каждого нового элемента я суммирую значение x других элементов в векторе:

std::vector<QPointF> points;

int getTotalTime() {
    int time = 0;
    for(QPointF& p : points) {
        time += p.x();
    }

    return time;
}

void addPointToGraph(const QPointF& p) {
    if(points.size() == 0) {
        points.push_back(p);
        return;
    }

    points.push_back(QPointF(getTotalTime() + p.x(), p.y()));
}

Таким образом, поэтому у меня будет непрерывная форма волны ... это прекрасно работает!Но теперь мне нужно найти амплитуду формы волны, поэтому мне нужно найти минимальное и максимальное значения y вектора points.

Например, мне нужна функция для возврата min y и max y как std::pair<float,float> Я видел в заголовке алгоритма, у нас есть что-то вроде:

  std::array<int,7> foo {3,7,2,9,5,8,6};

  auto result = std::minmax_element (foo.begin(),foo.end());

  // print result:
  std::cout << "min is " << *result.first;
  std::cout << ", at position " << (result.first-foo.begin()) << '\n';
  std::cout << "max is " << *result.second;
  std::cout << ", at position " << (result.second-foo.begin()) << '\n';

Вопрос в том, как я могу использовать ту же идею и перейти через свой собственный вектор и проверить только на y из баллов?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Существует перегрузка, которая принимает предикат сравнения, который вы можете использовать:

std::vector<QPointF> points /* = .. */;

std::minmax_element (points.begin(), points.end(),
                     [](const QPointF& lhs, const QPointF& rhs){
                         return lhs.y() < rhs.y();
                     });
0 голосов
/ 21 февраля 2019

std::minmax_elements, как и многие другие алгоритмы, обеспечивает перегрузку, которая принимает пользовательский предикат:

template< class ForwardIt, class Compare >
std::pair<ForwardIt,ForwardIt> 
    minmax_element( ForwardIt first, ForwardIt last, Compare comp );

Вы можете использовать это с лямбда-выражение для достижения желаемого:

const auto result = std::minmax_element(foo.begin(), foo.end(), 
    [](const QPointF& a, const QPointF& b){ return a.y() < b.y(); });
...