如何修复C++中std::unordered_set的operator[]匹配错误?
解决std::unordered_set无法使用operator[]的编译错误
编译错误信息
error: no match for ‘operator[]’ (operand types are ‘std::unordered_set<std::__cxx11::basic_string<char> >’ and ‘const string’ {aka ‘const std::__cxx11::basic_string<char>’}) int points = Prizes[Codes[code]]->points;
错误原因
Codes被声明为std::unordered_set<std::string>,而无序集合(unordered_set)没有operator[]成员函数。operator[]是键值对容器(如unordered_map)的特性,用于通过键访问对应的值;但unordered_set仅存储唯一元素值,没有键值映射关系,无法用[]来"索引"元素。
你的代码逻辑试图通过Codes[code]获取关联值,再用该值去Prizes(unordered_map)中查找奖品,这说明你对Codes的类型设计有误——你需要的不是单纯的code集合,而是code到奖品ID的映射关系。
修复方案
1. 修改成员变量类型
在Code_Processor类的protected段中,将Codes的类型从unordered_set改为unordered_map:
// 原代码 std::unordered_set <std::string> Codes; // 修改为 std::unordered_map <std::string, std::string> Codes; // 键:code字符串;值:对应奖品的ID(与Prizes的键一致)
2. 调整Enter_Code函数逻辑
修改后的代码可正确使用operator[],同时建议增加边界检查避免非法访问:
int Code_Processor::Enter_Code(const string &username, const string &code) { // 假设user_iter已从Names/Phones中正确初始化找到用户 User *user = user_iter->second; if (!user) { return 0; } // 查找code对应的奖品ID auto code_entry = Codes.find(code); if (code_entry == Codes.end()) { // 处理无效code的情况 return 0; } const std::string &prize_id = code_entry->second; // 查找对应的奖品 auto prize_entry = Prizes.find(prize_id); if (prize_entry == Prizes.end()) { // 处理奖品不存在的情况 return 0; } Prize *prize = prize_entry->second; // 累加积分并删除已使用的code int points = prize->points; user->points += points; Codes.erase(code_entry); return points; }
额外说明
如果你的需求仅为判断code是否存在,无需关联奖品ID,那Codes用unordered_set是合理的,但此时不能用Codes[code],需用Codes.count(code)或Codes.find(code)检查存在性。但从你的代码逻辑来看,显然需要code与奖品的映射关系,因此修改为unordered_map才是正确做法。
内容的提问来源于stack exchange,提问作者codeblue
相关产品推荐
相关产品推荐

