C++中std::vector异常问题:基础库存系统代码为何失效?
问题分析与修正
你的代码核心逻辑存在三个关键错误,导致无法实现预期的库存管理功能:
错误点说明
- 遍历过程中重复添加元素:在
else块的for循环里,每一次迭代都执行inventory.push_back(i),这会导致遍历原有库存时,每遍历一个元素就新增一个条目,完全偏离了“找到同名则更新数量,否则新增单个条目”的逻辑。 - 错误的数量更新方式:当找到同名元素时,你没有直接修改原有元素的
quantity,而是创建了一个新的Item对象并设置其数量为原数量+1,随后将这个新对象添加到库存中,这会导致库存中出现重复的同名条目,而非更新原有条目的数量。 - 未处理“无同名元素”的分支:遍历完所有库存元素后,如果没有找到同名条目,代码没有执行“新增数量为1的新条目”的操作,反而在遍历的每一次非匹配迭代中都添加了数量为1的新条目。
修正后的代码
#include <vector> #include <string> #include <iostream> struct Item { int quantity; std::string name; }; std::vector<Item> inventory; // 确保全局变量或正确的作用域声明 void AddItemToInventory(std::string itemName) { // 先遍历库存查找同名元素 for (auto& item : inventory) { if (item.name == itemName) { item.quantity += 1; // 直接修改原有元素的数量 return; // 找到后直接返回,无需后续操作 } } // 遍历结束未找到同名元素,新增条目 Item newItem; newItem.name = itemName; newItem.quantity = 1; inventory.push_back(newItem); // 可选:空库存的情况已经被上述逻辑覆盖,无需单独判断 if (inventory.size() == 1) { std::cout << "EMPTY\n"; } }
修正逻辑说明
- 先遍历整个库存,找到同名元素时直接修改其数量,然后立即返回,避免后续不必要的操作。
- 如果遍历完所有元素都没有找到同名条目,再创建新的
Item对象并添加到库存中。 - 原有的空库存判断可以被简化,因为当库存为空时,循环不会执行,直接进入新增条目的逻辑,此时库存大小变为1,可以按需输出提示。
内容的提问来源于stack exchange,提问作者KrystianCoder2
相关产品推荐
相关产品推荐

