You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 23:54:58