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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:51:12