我想删除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
相关产品推荐
相关产品推荐

