使用算法头查找自定义数据类型的最小值

时间:2019-02-21 10:22:30

标签: c++ qt stdvector stl-algorithm

我有一个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值。

例如我需要一个函数来返回最小值y和最大值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 :(得分:4)

std::minmax_elements与其他许多算法一样,提供了接受自定义谓词的重载:

fig, ax = plt.subplots(figsize=(12, 4))
sns.regplot(ax=ax1, x=data['x'], y = data['y'])

您可以将其与 lambda表达式结合使用以实现所需的目标:

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

答案 1 :(得分:3)

有一个过载,它带有您可能会使用的比较谓词:

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

std::minmax_element (points.begin(), points.end(),
                     [](const QPointF& lhs, const QPointF& rhs){
                         return lhs.y() < rhs.y();
                     });