C++编写for循环匹配两vector共享元素仅首条生效的解决方法
问题根因
- 仅读取了订单文件的第一条记录:当前代码只执行了一次订单读取和入队操作,没有加循环读取
orders_v5.txt内的所有订单,导致arrOrders容器中永远只有1条数据,自然只能处理第一条订单。 find_if的lambda实现逻辑错误:find_if本身会自动遍历目标容器的所有元素,lambda参数就是当前遍历到的Stock对象,不需要在lambda内部额外嵌套for循环遍历arrStock,多余的循环导致判断逻辑完全失效。- 库存校验逻辑错位:当前代码分开查找匹配title的商品、库存满足要求的商品,两个查找逻辑没有关联,哪怕找到的是完全不相关的商品库存满足,也会误判为当前订单库存足够,完全不符合需求。
修正后的
checkStock函数代码 void checkStock() { std::ifstream inFile("orders_v5.txt"); if (!inFile.is_open()) { std::cout << "订单文件打开失败" << std::endl; return; } Order anOrder; std::string orderTitle; int orderStock; // 循环读取所有订单存入arrOrders while (inFile >> anOrder.orderTitle >> anOrder.orderStock) { arrOrders.push_back(anOrder); } inFile.close(); std::cout << "#########################################################################################" << std::endl; std::cout << " ORDER REPORT" << std::endl; std::cout << "#########################################################################################" << std::endl; for (unsigned int k = 0; k < arrOrders.size(); k++) { orderTitle = arrOrders[k].getTitle(); orderStock = arrOrders[k].getStock(); // 查找和当前订单title匹配的商品 auto matchedStock = find_if(arrStock.begin(), arrStock.end(), [&orderTitle](const Stock& stock)->bool { // 直接判断当前遍历的商品title是否和订单title一致即可,不需要额外循环 return stock.getTitle() == orderTitle; }); if (matchedStock != arrStock.end()) { // 直接校验匹配到的商品的库存是否足够 if (matchedStock->getStockLevel() >= orderStock) { std::cout << orderTitle << " 在售,库存充足可满足订单需求。" << std::endl; } else { std::cout << orderTitle << " 在售,但库存不足无法满足订单需求。" << std::endl; } } else { std::cout << orderTitle << " 未在售。" << std::endl; } } }
额外优化建议
- 可以在
find_if的lambda参数中使用引用传递const Stock& stock,避免频繁拷贝Stock对象提升性能 - 新增文件打开失败的判断,避免文件不存在时程序无报错异常运行
- 输出内容末尾添加换行符,避免所有打印内容挤在同一行
内容的提问来源于stack exchange,提问作者crab_attack
相关产品推荐
相关产品推荐

