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

我想删除string vector中的指定单词,为什么我的C++代码无法正常删除?

代码无法删除指定单词的根本原因
  • 核心问题出在erazeVec的参数传递逻辑:C++函数参数默认是值传递,你写的void erazeVec(vector<string> vec)会对传入的vector做完整拷贝,函数内部所有删除操作都是在副本上执行,完全不会影响main函数中定义的原始vector,所以调用完删除函数后两次打印的结果完全一致。
  • 补充:你代码中手写的遍历删除逻辑本身是正确的(erase元素后没有立刻递增索引,避免跳过相邻的待删除元素),只需要修改参数传递方式即可解决问题。
修复方案

1. 快速修复:将参数改为引用传递

在参数类型后加&代表传递引用,函数内部会直接操作外层传入的原始vector:

// 修改函数签名,加&表示引用传递
void erazeVec(vector<string>& vec) {
    // 原有逻辑不需要改动
    for (size_t i{0};i < vec.size();) {
        if (vec[i] == "war") {
            vec.erase(vec.begin() + i);
        }
        else {
            i++;
        }
    }
}

2. 更规范的实现:使用STL erase-remove惯用法

C++标准库提供了更简洁高效的批量元素删除实现,不需要手写遍历逻辑:

// 需先引入algorithm头文件
#include <algorithm>

void erazeVec(vector<string>& vec) {
    vec.erase(std::remove(vec.begin(), vec.end(), "war"), vec.end());
}
额外优化建议

printVec函数不需要修改vector内容,也可以改为const引用传递,避免拷贝大vector的性能开销:

void printVec(const vector<string>& x) {
    for (int i{};i < x.size();i++) {
        cout << x[i] << "\t";
    }
    cout << endl;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:36:04