C++如何实现vector中重复fruit_name查找与quantity合并?
重复水果条目合并实现方案
核心实现思路
- 以水果名称为唯一标识做分组遍历,同名条目累计重量值
- 同名称水果直接保留首次出现的单价,不做覆盖
- 输出格式和原数据保持列对齐
现存代码问题修正
你当前的文件读取逻辑存在无效条目冗余问题:循环内先无判断执行
push_back,再执行数据读取,当读到文件末尾触发EOF标记时,最后一次读取的内容为空,会导致vector末尾多一个无效的空结构体对象。实现时会先修正这个逻辑。
合并逻辑说明
这里使用std::map做水果名称到合并结果的映射,它本身会自动按水果名称的字典序排序,无需额外编写排序代码,刚好匹配示例输出的排序风格
完整实现代码
#include <vector> #include <fstream> #include <map> #include <cstdio> #include <string> // 自定义宏值,和你原有定义保持一致 #define MAX_LENGTH 32 struct fruit_t { char fruit_name[MAX_LENGTH]; // 水果名称 float quantity; // 重量,单位为磅 float price; // 水果单价 }; int main() { vector<fruit_t> fruit; ifstream inFile; inFile.open("list1.txt"); fruit_t temp_item; // 修正后的读取逻辑:读入三个值全部成功才存入vector,避免无效条目 while (inFile >> temp_item.fruit_name >> temp_item.quantity >> temp_item.price) { fruit.push_back(temp_item); } inFile.close(); // 合并逻辑核心 map<string, fruit_t> merged_result; for (const auto& item : fruit) { // 用水果名称字符串作为map的键 string name_key(item.fruit_name); // 首次遇到该水果,直接存入映射表 if (merged_result.count(name_key) == 0) { merged_result[name_key] = item; } else { // 重复条目直接累加重量 merged_result[name_key].quantity += item.quantity; } } // 对齐格式输出结果 printf("%-20s %-10s %-10s\n", "fruit_name", "quantity", "price"); for (const auto& res : merged_result) { printf("%-20s %-10.2f %-10.2f\n", res.second.fruit_name, res.second.quantity, res.second.price); } return 0; }
计算结果验证
代入你提供的原始测试数据,输出数值和示例完全匹配:
- 累计
apples_gala三次重量:1.80 + 3.00 + 1.45 = 6.25,单价保持1.21不变 - 累计
oranges_honeybell两次重量:4.20 + 4.22 = 8.42,单价保持1.08不变 - 其余无重复名称的水果直接保留原有数值
可选优化方向
- 不需要按名称字典序排序的场景,可以把
map替换为unordered_map,平均查找效率从O(logn)提升到O(1),处理大文件时性能更好 - 原代码中未使用的
count、i变量可以直接删除,减少冗余逻辑
内容的提问来源于stack exchange,提问作者An Phan
相关产品推荐
相关产品推荐

