使用算法 header 查找自定义数据类型的 minmax
Find minmax of custom data type using algorithm header
我有一个 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()));
}
所以我会有一个连续的波形...这很好用!但是现在我需要找到波形的幅度,所以我需要找到 points
向量的最小和最大 y
值。
例如我需要一个 return min y
和 max y
的函数,就像 std::pair<float,float>
我在算法 header 中看到的那样:
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
个点?
std::minmax_elements
,像许多其他算法一样,提供了一个接受自定义谓词的重载:
template< class ForwardIt, class Compare >
std::pair<ForwardIt,ForwardIt>
minmax_element( ForwardIt first, ForwardIt last, Compare comp );
您可以将其与 lambda 表达式一起使用 来实现您想要的:
const auto result = std::minmax_element(foo.begin(), foo.end(),
[](const QPointF& a, const QPointF& b){ return a.y() < b.y(); });
有一个重载,它采用您可能会使用的比较谓词:
std::vector<QPointF> points /* = .. */;
std::minmax_element (points.begin(), points.end(),
[](const QPointF& lhs, const QPointF& rhs){
return lhs.y() < rhs.y();
});
我有一个 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()));
}
所以我会有一个连续的波形...这很好用!但是现在我需要找到波形的幅度,所以我需要找到 points
向量的最小和最大 y
值。
例如我需要一个 return min y
和 max y
的函数,就像 std::pair<float,float>
我在算法 header 中看到的那样:
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
个点?
std::minmax_elements
,像许多其他算法一样,提供了一个接受自定义谓词的重载:
template< class ForwardIt, class Compare > std::pair<ForwardIt,ForwardIt> minmax_element( ForwardIt first, ForwardIt last, Compare comp );
您可以将其与 lambda 表达式一起使用 来实现您想要的:
const auto result = std::minmax_element(foo.begin(), foo.end(),
[](const QPointF& a, const QPointF& b){ return a.y() < b.y(); });
有一个重载,它采用您可能会使用的比较谓词:
std::vector<QPointF> points /* = .. */;
std::minmax_element (points.begin(), points.end(),
[](const QPointF& lhs, const QPointF& rhs){
return lhs.y() < rhs.y();
});