You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C++中‘users’未在此作用域声明问题求助(首次使用map)

问题排查与解决方案

嘿,我一眼就揪出你这个编译错误的根源啦,咱们一步步理清楚:

核心错误:变量作用域问题

你代码里的std::set<string> users = search->second;是定义在if(search != sd.end())的代码块(大括号{})内部的。在C++里,代码块内定义的变量仅在当前代码块生效,一旦跳出这个大括号,users就会被销毁。后面再写users.find(un)或者users.erase(un)时,编译器根本找不到这个变量,自然就报了'users' was not declared in this scope的错误。

另外你担心的「map获取对应值的方式」——你用search->second是完全正确的!std::map的迭代器指向的是std::pair对象,first存键(这里是ServerName类型的sn),second就是对应的值(你的场景里是std::set<string>),这部分用法没毛病~

修正后的代码示例

我帮你调整了代码,既解决了作用域问题,还优化了性能(比如避免重复调用find):

bool DeleteConnection(ServerData &sd, ServerName sn, UserName un){
    // 只调用一次find,把结果存起来,避免重复查找浪费性能
    auto search = sd.find(sn);
    if(search == sd.end()){
        // 找不到对应服务器,直接返回false
        return false;
    }

    // 用引用绑定到map里的set,避免拷贝整个集合,提升效率
    std::set<string>& users = search->second;
    const bool is_in = users.find(un) != users.end();

    if(is_in){
        // 找到目标用户,执行删除
        users.erase(un);
        // 因为users是引用,修改后map里的集合会自动同步,不用再手动赋值给sd[sn]
        return true; // 假设删除成功返回true
    }

    // 用户不在该服务器的连接列表中
    return false;
}

额外小建议

  1. 如果希望某个服务器的用户集合为空时,自动把该服务器从map中移除,可以在users.erase(un)之后加一段判断:
if(users.empty()){
    sd.erase(search);
}
  1. 尽量避免在同一逻辑中多次调用map::find,你原来的代码里先判断sd.find(sn) == sd.end(),又重新auto search = sd.find(sn),这会做两次相同的查找,有点浪费性能,只调用一次就够啦。

内容的提问来源于stack exchange,提问作者malaria

火山引擎 最新活动