C++删除list<list<string>>中字符串 迭代器调用erase报错如何解决
问题原因与解决方案
为什么遍历listOfList的迭代器itr不是list类型
你定义的listOfList是list<list<string>>类型的容器,该容器的迭代器itr本质是用于指向容器内元素的工具,本身属于迭代器类型,而非容器类型。它指向的元素才是list<string>类型,你需要通过解引用操作*itr或者箭头操作符itr->才能访问到这个内层list<string>容器。
你遇到的报错class "std::_List_iterator<...>" has no member "erase",就是因为你尝试在迭代器对象itr上调用只有list容器才具备的erase成员方法导致的。
代码中存在的其他错误
erase参数类型错误:erase方法要求传入指向待删除元素的迭代器,你代码中传入的*it6是std::string类型的元素值,类型不匹配。- 迭代器失效风险:在遍历list的过程中直接删除当前迭代器指向的元素,会导致当前迭代器立即失效,后续执行迭代器自增操作会触发未定义行为。
- 变量名拼写错误:外层循环终止条件写为
listeOfListe.end(),和你定义的容器名listOfList不一致,运行时会直接触发未定义行为。
修复方案
根据你的业务需求选择对应实现:
场景1:满足condition时,清空对应内层list的所有元素
无需遍历内层list,直接调用容器的clear方法即可,性能更高:
for (list<list<string>>::iterator itr = listOfList.begin(); itr != listOfList.end(); itr++){ if (condition) { itr->clear(); } }
场景2:满足condition时,仅删除内层list中符合特定要求的元素
需要通过erase的返回值获取下一个有效迭代器,避免迭代器失效:
for (list<list<string>>::iterator itr = listOfList.begin(); itr != listOfList.end(); itr++){ if (condition) { list<string>::iterator it6 = itr->begin(); while (it6 != itr->end()) { if (/* 此处填写内层元素的删除判断条件 */) { it6 = itr->erase(it6); } else { it6++; } } } }
场景3:满足condition时,直接将整个内层list从外层容器中删除
需要处理外层迭代器的失效问题:
list<list<string>>::iterator itr = listOfList.begin(); while (itr != listOfList.end()) { if (condition) { itr = listOfList.erase(itr); } else { itr++; } }
内容的提问来源于stack exchange,提问作者JavaRun
相关产品推荐
相关产品推荐

