C++报错expression must have bool type的原因及修复方案咨询
错误原因分析
你遇到的报错是因为在C中,std::set的迭代器不能直接作为布尔值放在if条件里。s.find(x)返回的是一个迭代器:找到元素时,迭代器指向该元素;没找到时,返回s.end()(容器末尾的空迭代器,不指向任何元素)。而C不允许把普通迭代器隐式转换成布尔值,所以编译器抛出了这个错误。
修复方案
把条件判断改成比较迭代器是否不等于s.end(),有两种可行写法:
写法一(C++17及以上版本支持)
在if语句中直接声明迭代器并完成判断:
if (set<int>::iterator itr = s.find(x); itr != s.end())
写法二(兼容所有C++版本)
先单独声明迭代器,再进行判断:
set<int>::iterator itr = s.find(x); if (itr != s.end())
修复后的完整代码
int main() { set<int> s; int q, y, x; cin >> q; for (int i = 0; i < q; i++) { cin >> y; if (y == 1) { cin >> x; s.insert(x); } else if (y == 2) { cin >> x; set<int>::iterator itr = s.find(x); if (itr != s.end()) { s.erase(x); } } else { cin >> x; set<int>::iterator itr = s.find(x); if (itr != s.end()) { cout << "Yes"; } else { cout << "No"; } } } return 0; }
额外优化提示:如果只是要执行删除操作,其实不需要提前判断元素是否存在——s.erase(x)本身会返回成功删除的元素个数(0或1),所以else if(y==2)的代码可以简化为cin >> x; s.erase(x);,逻辑完全成立且更简洁。
内容的提问来源于stack exchange,提问作者Dung Tran
相关产品推荐
相关产品推荐

