使用std::count统计vector<Item>元素数量时出现类型差异如何解决?
问题原因
这个错误确实是vector存储自定义Item类型导致的。std::count的默认逻辑是逐个将容器内的元素和第三个传入的对比值做==运算判断是否相等,你当前传入的对比值是int类型的type,而容器里的元素是Item类型,C++默认没有提供Item和int的相等比较运算符实现,所以编译阶段就会抛出你遇到的no match for 'operator==' (operand types are 'Item' and 'const int')错误。
另外注意你描述的“运行时错误”属于误判,该错误是编译阶段的类型检查失败,程序还未进入运行阶段。
解决方法
优先推荐第一种方案,无需修改原有Item结构体定义,灵活性最高:
- 方案1:改用
std::count_if自定义匹配规则std::count_if支持传入自定义的匹配谓词,你可以用lambda直接指定只对比item_number字段:
int type = boat_list.at(i).item_number; int type_count = std::count_if(boat_list.begin(), boat_list.end(), [type](const Item& item) { return item.item_number == type; });
- 方案2:为Item结构体重载和int比较的
==运算符
如果你业务中经常需要直接将Item实例和int值对比item_number,可以在Item的定义中补充运算符重载:
struct Item { int item_number; // 其余原有字段... bool operator==(int num) const { return this->item_number == num; } };
重载完成后你原来的std::count写法就可以正常运行。
额外注意
你贴出的代码里还有一处逻辑错误:if (type = boat_list.at(j).item_number)中使用了赋值运算符=而非相等比较运算符==,会导致type变量被意外覆盖,判断逻辑完全失效,需要修改为if (type == boat_list.at(j).item_number)。
内容的提问来源于stack exchange,提问作者Stanky-kun
相关产品推荐
相关产品推荐

