C++自定义结构体排序技巧解析
需积分: 50 114 浏览量
更新于2024-09-15
1
收藏 15KB DOCX 举报
"C++中如何对自定义结构体进行排序"
在C++编程中,当我们需要对存储自定义结构体的容器(如vector)进行排序时,由于标准库的排序函数(如std::sort)默认是按照内存地址排序,这并不符合我们的需求。为了解决这个问题,我们可以采用两种主要的方法来实现自定义结构体的排序,这两种方法都在提供的代码示例中得到了体现。
方法1:重载比较运算符
在结构体中定义`<`和`>`运算符重载,这样可以使得结构体实例能够直接进行比较。例如,结构体`AssessTypeInfo`包含`m_uiType`作为排序键,我们可以通过比较`m_uiType`来确定排序顺序。
```cpp
struct AssessTypeInfo {
unsigned int m_uiType; // 类型ID
char m_szName[64]; // 类型名称
unsigned int m_uiTotal; // 总分数
bool operator<(const AssessTypeInfo& rhs) const { // 升序排序
return m_uiType < rhs.m_uiType;
}
bool operator>(const AssessTypeInfo& rhs) const { // 降序排序
return m_uiType > rhs.m_uiType;
}
};
```
然后,我们可以直接调用`std::sort`函数,它会根据重载的比较运算符进行排序:
```cpp
sort(ctn.begin(), ctn.end()); // 默认为升序排序
sort(ctn.begin(), ctn.end(), greater<AssessTypeInfo>()); // 降序排序
```
方法2:使用函数对象(functor)
如果我们不想修改结构体的定义,我们可以创建一个函数对象(functor)来完成比较任务。函数对象是一个具有`operator()`成员函数的对象,它可以被当作函数来调用。例如,我们可以创建一个专门用于`AssessTypeInfo`的比较函数对象:
```cpp
struct CompareByType {
bool operator()(const AssessTypeInfo& lhs, const AssessTypeInfo& rhs) const {
return lhs.m_uiType < rhs.m_uiType; // 升序
}
};
// 使用函数对象进行排序
sort(ctn.begin(), ctn.end(), CompareByType());
```
如果需要降序排序,我们可以稍微修改比较函数对象,使其返回相反的比较结果:
```cpp
struct CompareByTypeDesc {
bool operator()(const AssessTypeInfo& lhs, const AssessTypeInfo& rhs) const {
return lhs.m_uiType > rhs.m_uiType; // 降序
}
};
// 使用降序比较函数对象进行排序
sort(ctn.begin(), ctn.end(), CompareByTypeDesc());
```
总结来说,C++提供了多种方法来处理自定义结构体的排序问题,包括重载比较运算符和使用函数对象。这些方法使得我们可以灵活地根据结构体内的特定成员进行排序,无论是升序还是降序。通过理解并熟练运用这些技巧,可以更好地组织和操作复杂的数据结构。
2015-07-12 上传
2023-06-06 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
2024-10-23 上传
2023-09-03 上传
邢云流水
- 粉丝: 1
- 资源: 14
最新资源
- Android圆角进度条控件的设计与应用
- mui框架实现带侧边栏的响应式布局
- Android仿知乎横线直线进度条实现教程
- SSM选课系统实现:Spring+SpringMVC+MyBatis源码剖析
- 使用JavaScript开发的流星待办事项应用
- Google Code Jam 2015竞赛回顾与Java编程实践
- Angular 2与NW.js集成:通过Webpack和Gulp构建环境详解
- OneDayTripPlanner:数字化城市旅游活动规划助手
- TinySTM 轻量级原子操作库的详细介绍与安装指南
- 模拟PHP序列化:JavaScript实现序列化与反序列化技术
- ***进销存系统全面功能介绍与开发指南
- 掌握Clojure命名空间的正确重新加载技巧
- 免费获取VMD模态分解Matlab源代码与案例数据
- BuglyEasyToUnity最新更新优化:简化Unity开发者接入流程
- Android学生俱乐部项目任务2解析与实践
- 掌握Elixir语言构建高效分布式网络爬虫