C++中如何基于结构体实现二叉搜索树并处理天气数据计算?
问题解答
1. 重载bool operator>的可行性与通用性
完全可以通过重载operator>实现Record的排序插入,但必须注意DateTime字符串的比较逻辑正确性:
- 若直接用原格式
dd/mm/yyyy xx:xx做字符串比较,会出现逻辑错误(比如01/02/2018的字符串会被判定为比10/01/2018大,但实际日期更早)。需先将DateTime转换为可按字典序正确反映时间先后的格式(如yyyy/mm/dd xx:xx),或转成整数(如yyyyMMddHHmm格式的数值,例如2018年1月1日12:30转为201801011230)再做比较。 - 通用性方面:如果你的BST模板依赖
operator>确定插入顺序,这个方案在仅按DateTime排序的场景下是通用的。但如果后续需要按其他字段(如温度)排序,要么修改operator>的实现,要么给BST模板添加自定义比较器的模板参数——后者更灵活,无需改动Record结构体。
示例重载代码(假设DateTime已转为可正确比较的格式):
struct Record { string DateTime; float temperature; // 重载operator>,晚的记录视为"更大" bool operator>(const Record& other) const { return this->DateTime > other.DateTime; } };
2. 关于转int+map的方案:完全没必要
这个方案属于冗余设计:
std::map本身就是基于平衡二叉搜索树(红黑树)实现的有序容器,直接用std::map或std::multimap(支持同一时间多条记录)存储Record,指定好比较规则,就能实现高效的有序存储与范围查询,不需要额外套一层自定义BST。- 你的核心需求是按时间范围检索(如2018年各月),
std::map的lower_bound和upper_bound方法可以快速定位到目标时间区间的首尾迭代器,遍历区间内的记录即可统计温度均值,效率远高于普通非平衡BST。
更优实现建议
第一步:修正DateTime的比较逻辑
优先将DateTime转换为可准确比较的类型:
- 转成
time_t:利用C++标准库的std::strptime解析字符串为tm结构,再转成time_t,直接通过数值大小比较时间先后。 - 转成整数:将
dd/mm/yyyy xx:xx解析为yyyyMMddHHmm格式的64位整数,数值比较完全符合时间顺序。
第二步:用自定义比较器替代硬编码运算符
如果不想修改Record结构体,或需要支持多种排序规则,给你的BST模板添加比较器模板参数:
// 自定义比较器:按DateTime转换后的整数比较 struct CompareRecordByTime { bool operator()(const Record& a, const Record& b) const { // 假设convertToInt是你实现的DateTime转整数函数 long long timeA = convertToInt(a.DateTime); long long timeB = convertToInt(b.DateTime); return timeA > timeB; // 晚的记录视为更大,适配BST插入规则 } }; // 实例化支持自定义比较的BST BST<Record, CompareRecordByTime> temperatureBST;
第三步:针对时间范围查询的优化
如果使用std::multimap(支持同一时间多条记录),可这样实现2018年1月的均值统计:
// 假设已将DateTime转成yyyyMMddHHmm格式的long long作为map的key std::multimap<long long, Record> tempMap; // 定义2018年1月的时间范围 long long janStart = 201801010000; long long janEnd = 201801312359; // 获取区间迭代器 auto startIt = tempMap.lower_bound(janStart); auto endIt = tempMap.upper_bound(janEnd); // 统计温度 float sum = 0.0f; int count = 0; for (auto it = startIt; it != endIt; ++it) { sum += it->second.temperature; count++; } float avg = count > 0 ? sum / count : 0.0f;
内容的提问来源于stack exchange,提问作者Emil Lang
相关产品推荐
相关产品推荐

