stl之map 排序

本文详细介绍了在STL中使用结构体进行排序时遇到的问题,并提供了两种解决方案:一是重载小于号运算符,二是使用仿函数。通过示例代码演示了如何实现正确的排序逻辑。

  排序问题,STL中默认是采用小于号来排序的,因为设置int等类型做key,它本身支持小于号运算,在一些特殊情况,比如关键字是一个结构体,涉及到排序就会出现问题,因为它没有小于号操作,insert等函数在编译的时候过不去,下面给出两个方法解决这个问题:

第一种:小于号重载,程序举例

 1 #include <map>
 2 #include <string>
 3 using namespace std;
 4 typedef struct tagStudentInfo
 5 {
 6        int      nID;
 7        string   strName;
 8 }StudentInfo, *PStudentInfo;  //学生信息
 9 
10 int main()
11 {
12     int nSize;          //用学生信息映射分数
13     map<StudentInfo, int>mapStudent;
14     map<StudentInfo, int>::iterator iter;
15     StudentInfo studentInfo;
16     studentInfo.nID = 1;
17     studentInfo.strName = “student_one”;
18     mapStudent.insert(pair<StudentInfo, int>(studentInfo, 90));
19     studentInfo.nID = 2;
20     studentInfo.strName = “student_two”;
21 
22     mapStudent.insert(pair<StudentInfo, int>(studentInfo, 80));
23     for (iter=mapStudent.begin(); iter!=mapStudent.end(); iter++)
24         cout<<iter->first.nID<<endl<<iter->first.strName<<endl<<iter->second<<endl;
25 }
26 //以上程序是无法编译通过的,只要重载小于号,就OK了,如下:
27 
28 typedef struct tagStudentInfo
29 {
30    int      nID;
31    string   strName;
32    Bool operator < (tagStudentInfo const& _A) const
33    {   
34       //这个函数指定排序策略,按nID排序,如果nID相等的话,按strName排序
35       if(nID < _A.nID)  return true;
36       if(nID == _A.nID) return strName.compare(_A.strName) < 0;
37       return false;
38    }   
39 }StudentInfo, *PStudentInfo;  //学生信息

第二种:仿函数的应用,这个时候结构体中没有直接的小于号重载,程序说明

 1 #include <map>
 2 #include <iostream>
 3 #include <string>
 4 using namespace std;
 5 
 6 typedef struct tagStudentInfo
 7 {
 8     int      nID;
 9     string   strName;
10 }StudentInfo, *PStudentInfo;  //学生信息
11 
12 class sort{
13 public:
14     bool operator() (StudentInfo const & _A, StudentInfo const & _B) const
15     {
16         if(_A.nID < _B.nID){
17             return true;
18         }else if (_A.nID == _B.nID){
19             return _A.strName.compare(_B.strName) < 0;
20         }
21         return false;
22     }
23 };
24 
25 int main()
26 {
27     int nSize;          //用学生信息映射分数
28     map<StudentInfo, int, sort> mapStudent;
29     StudentInfo studentInfo;
30     studentInfo.nID = 1;
31     studentInfo.strName = "student_one";
32 
33     mapStudent.insert(pair<StudentInfo, int>(studentInfo, 90));
34     studentInfo.nID = 2;
35     studentInfo.strName = "tudent_two";
36     mapStudent.insert(pair<StudentInfo, int>(studentInfo, 80));
37 
38     std::map<StudentInfo, int, sort>::iterator  it;
39     for(it = mapStudent.begin(); it != mapStudent.end(); it++){
40         std::cout << it->second << std::endl;
41     }
42 }

 

转载于:https://www.cnblogs.com/chris-cp/p/5053380.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值