如何在std::vector存储的Point结构体中查找成员y的最大值
实现方案
std::max_element完全支持自定义比较规则,你只需要传入适配Point结构体的比较逻辑即可,常用的实现方式有以下几种:
方法1:Lambda表达式(C++11及以上版本推荐,写法最简洁)
需要引入<algorithm>头文件,直接在调用时传入匿名比较函数即可:
#include <vector> #include <algorithm> struct Point { double x,y; }; int main() { std::vector<Point> points; // 你的2000个元素的容器 // 第三个参数传入比较逻辑,按y值升序规则比较两个Point对象 auto max_y_it = std::max_element(points.begin(), points.end(), [](const Point& a, const Point& b) { return a.y < b.y; }); // 先判空避免空容器访问越界 if (max_y_it != points.end()) { Point max_point = *max_y_it; // 拿到y值最大的Point对象 double max_y = max_point.y; } return 0; }
方法2:独立比较函数(兼容C++03及更早的旧标准)
如果你的项目还在使用不支持Lambda的旧C++标准,可以单独定义比较函数:
// 全局比较函数 bool compareByY(const Point& a, const Point& b) { return a.y < b.y; } // 调用时传入函数名即可 std::vector<Point>::iterator max_y_it = std::max_element(points.begin(), points.end(), compareByY);
方法3:重载<运算符(适合高频比较Point的场景)
如果你的项目里经常需要按y值比较Point的大小,可以直接给结构体重载<运算符,后续所有默认比较的STL算法都可以直接使用:
struct Point { double x,y; bool operator<(const Point& other) const { return y < other.y; } }; // 调用时不需要额外传比较参数,直接用默认比较规则即可 auto max_y_it = std::max_element(points.begin(), points.end());
注意事项
你当前只有2000个元素的规模,以上三种写法的性能没有任何差异,优先选择和你项目代码风格统一的实现即可。调用后必须先判断返回的迭代器不等于容器的end(),避免容器为空时访问非法内存。
内容的提问来源于stack exchange,提问作者T0maas
相关产品推荐
相关产品推荐

