从map的vector中删除元素后元素仍存在的问题咨询
从map的vector中删除元素后元素仍存在的问题咨询
嘿,我来帮你拆解这段代码里的问题,你遇到的情况其实是几个小细节没处理对:
首先最核心的问题:你并没有真的从vector里移除元素!你现在做的只是把那个位置的指针设为nullptr,但vector的长度没变,那个位置依然存在,只是存的是空指针而已——所以你检查的时候会看到vector里还有“元素”,只是这个元素是空的。
然后还有个明显的循环bug:内层循环的增量写的是++it,但这里应该是++it1啊!这会导致外层的map迭代器it被错误地往前跳,直接打乱了整个遍历逻辑,说不定你想处理的元素根本没被正确定位到。
另外还有个潜在的坑:你得确认myObject->GetFoo()返回的是map的引用还是拷贝。如果是值返回(也就是返回std::map<...>而不是std::map<...>&),那你拿到的fKeys只是原对象map的一个副本,你对副本做的任何修改都不会影响原对象里的内容——如果你检查的是原对象里的vector,那自然看不到变化。
给你个修正后的代码示例,解决这些问题:
bool found = false; // 如果GetFoo返回的是引用,就不需要拷贝,直接用引用 auto& fKeys = myObject->GetFoo(); for (auto it = fKeys.begin(); it != fKeys.end() && !found; ++it) { // 内层循环的增量改成++it1,这才是遍历vector的索引 for (size_t it1 = 0; it1 < it->second.size() && !found; ++it1) { if (/* some condition */) { found = true; // 先释放指针指向的内存 delete it->second[it1]; // 真正从vector中移除这个元素,这会让vector长度减一 it->second.erase(it->second.begin() + it1); } } }
再补充几点:
- 使用
erase后,vector中该位置后面的元素会自动前移,不过这里因为我们设置了found = true,循环会直接退出,所以不用调整索引。 - 一定要确保
Foo*是用new分配的,不然delete会导致未定义行为。 - 如果
GetFoo()确实需要返回拷贝,那你修改完fKeys后,可能需要把它赋值回原对象(比如myObject->SetFoo(fKeys)),不然修改不会生效。
内容来源于stack exchange
相关产品推荐
相关产品推荐

