C++统计字符串数组重复单词次数存入map时代码报错如何解决
问题排查与修复方案
报错根因
- 函数形参
string list[]会自动退化为std::string*指针类型,指针属于C++基础类型,不存在begin()、end()成员方法,直接调用这两个方法就会触发编译报错。 - 代码未使用传入的数组长度参数
n,数组没有自带长度信息,必须通过传入的n控制遍历边界。
修复代码
方案1:下标遍历(易读性更高)
int countWords(string list[], int n) { map <string, int> mp; for(int i = 0; i < n; i++){ mp[list[i]]++; } int res = 0; for(auto val = mp.begin(); val != mp.end(); val++){ if(val->second == 2) res++; } return res; }
方案2:迭代器风格遍历(保留原有写法逻辑)
int countWords(string list[], int n) { map <string, int> mp; // 指针本身支持迭代器运算,直接用指针计算遍历边界 for(auto val = list; val != list + n; val++){ mp[*val]++; } int res = 0; for(auto val = mp.begin(); val != mp.end(); val++){ if(val->second == 2) res++; } return res; }
注意事项
- 两种方案均完全保留原有逻辑,仅修改了数组遍历部分的错误代码,统计恰好出现2次的单词数量的功能不受影响。
- 如果是在C++11及以上版本编译,也可以用范围for简化map的遍历写法,代码可读性更高。
内容的提问来源于stack exchange,提问作者Sourabh Singh
相关产品推荐
相关产品推荐

