跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++ 最值操作
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C++最值操作 = '''C++标准模板库(STL)'''提供了一系列高效的算法来处理容器中的最值问题。本专题将详细介绍如何利用STL算法寻找容器中的'''最小值'''、'''最大值'''以及同时获取两者。 == 核心算法介绍 == === min/max 基础函数 === 最基础的单值比较函数,适用于任意可比较数据类型: <syntaxhighlight lang="cpp"> #include <algorithm> int a = 5, b = 3; std::cout << "最小值: " << std::min(a, b); // 输出 3 std::cout << "最大值: " << std::max(a, b); // 输出 5 </syntaxhighlight> === minmax 函数(C++11起) === 返回包含最小值和最大值的pair对象: <syntaxhighlight lang="cpp"> auto result = std::minmax({2, 5, 1, 4, 3}); std::cout << "Min: " << result.first << ", Max: " << result.second; // 输出: Min: 1, Max: 5 </syntaxhighlight> == 容器范围操作 == === min_element/max_element === 查找容器范围内的极值迭代器: <syntaxhighlight lang="cpp"> std::vector<int> v{3, 1, 4, 1, 5, 9}; auto min_it = std::min_element(v.begin(), v.end()); auto max_it = std::max_element(v.begin(), v.end()); std::cout << "最小值位置: " << std::distance(v.begin(), min_it) << " 值: " << *min_it << '\n'; // 输出: 最小值位置: 1 值: 1 </syntaxhighlight> === minmax_element(C++11起) === 单次遍历同时获取最小最大值迭代器: <syntaxhighlight lang="cpp"> auto [min, max] = std::minmax_element(v.begin(), v.end()); std::cout << "范围极值: " << *min << "~" << *max; // 输出: 范围极值: 1~9 </syntaxhighlight> == 性能比较 == <mermaid> barChart title 算法时间复杂度比较 x-axis 算法 y-axis 时间复杂度 bar min/max : O(1) bar minmax : O(n) bar min_element : O(n) bar minmax_element : O(n) </mermaid> == 自定义比较函数 == 所有最值算法都支持自定义比较器: <syntaxhighlight lang="cpp"> struct Point { int x, y; }; std::vector<Point> points{{1,2}, {3,1}, {2,3}}; // 按y坐标比较 auto comp = [](const Point& a, const Point& b) { return a.y < b.y; }; auto min_y = *std::min_element(points.begin(), points.end(), comp); std::cout << "最低点: (" << min_y.x << "," << min_y.y << ")"; // 输出: 最低点: (3,1) </syntaxhighlight> == 实际应用案例 == === 案例1:成绩分析系统 === <syntaxhighlight lang="cpp"> std::map<std::string, int> scores{ {"Alice", 85}, {"Bob", 72}, {"Charlie", 90} }; // 找最高分学生 auto top = std::max_element(scores.begin(), scores.end(), [](auto& a, auto& b) { return a.second < b.second; }); std::cout << "最高分: " << top->first << " (" << top->second << "分)"; </syntaxhighlight> === 案例2:温度监控 === <syntaxhighlight lang="cpp"> std::array<double, 7> temps{22.5, 23.1, 21.8, 25.3, 24.9, 20.7, 19.4}; auto [coldest, hottest] = std::minmax_element(temps.begin(), temps.end()); std::cout << "日温差: " << *hottest - *coldest << "℃\n" << "高温警报: " << (*hottest > 25.0 ? "是" : "否"); </syntaxhighlight> == 数学扩展 == 对于浮点数数组,结合<nobr><math>\operatorname{argmin}</math></nobr>概念: <syntaxhighlight lang="cpp"> std::vector<double> data{1.2, 3.4, 0.9, 2.1}; auto argmin = std::distance(data.begin(), std::min_element(data.begin(), data.end())); std::cout << "最小值索引: " << argmin << " (数学argmin)"; </syntaxhighlight> == 最佳实践建议 == * 对于大型容器,优先使用'''minmax_element'''而非分开调用 * 自定义对象比较时确保比较函数满足'''严格弱序'''关系 * 注意迭代器失效问题,获取极值后若修改容器需重新查询 * 多线程环境下考虑使用并行算法(C++17起) == 参见 == * [[C++ STL算法]] * [[C++迭代器]] * [[C++ lambda表达式]] [[Category:编程语言]] [[Category:C++]] [[Category:C++stl 算法]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)