C++向量迭代中字符串比较失效,词计数算法出错求助
问题分析与修复方案
核心问题
你代码里的bug根源是vector删除元素后的索引偏移:当执行words.erase(words.begin() + j)删除第j个元素时,j位置之后的所有元素都会往前挪一位。但你的内层循环里j会继续自增,这就跳过了原本在j+1位置、现在移到j位置的元素,导致部分重复单词没被统计到。
修复嵌套循环的代码
把内层循环的j自增逻辑改成手动控制,只有当不删除元素时才递增j:
for(int i = 0; i < words.size(); i++) { finalWords.push_back(words[i]); int counts = 1; for(int j = i + 1; j < words.size(); ) { // 这里去掉循环里的j++ if(words[i] == words[j]) { counts++; words.erase(words.begin() + j); // 删除后j不递增,因为下一个元素已经移到当前j的位置 } else { j++; // 只有没找到重复时才移动j } } wordCount.push_back(counts); }
更高效的推荐实现
嵌套循环的时间复杂度是O(n²),当单词数量多的时候效率很低。用C++标准库的哈希表std::unordered_map可以更简洁高效地完成统计:
#include <unordered_map> // ... std::unordered_map<std::string, int> wordCounter; // 遍历所有单词,自动统计次数 for(const auto& word : words) { wordCounter[word]++; } // 把统计结果转存到你需要的两个vector里 for(const auto& entry : wordCounter) { finalWords.push_back(entry.first); wordCount.push_back(entry.second); }
这种方式不需要手动处理索引和元素删除,代码更易读,平均时间复杂度是O(n),比嵌套循环高效得多。
内容的提问来源于stack exchange,提问作者Fhz
相关产品推荐
相关产品推荐

