向量迭代器与向量擦除时不兼容

Yak*_*kov 1 c++ iterator vector map erase

我有一个元素是向量的映射.我必须从这些向量中删除所有等于特殊数字的元素 num

std::map<size_t,std::vector<size_t> > myMap;
for (std::map<size_t,std::vector<size_t> >::iterator itMap = myMap.begin();itMap != myMap.end();++itMap )
{
    for (std::vector<size_t>::iterator itVec = itMap->second.begin();itVec != itMap->second.end();)
    {
        auto itNextVec = itVec;
        ++itNextVec;
        if (*itVec == num)
        {
            itMap->second.erase(itVec );
        }
        itVec = itNextVec;
    }
}
Run Code Online (Sandbox Code Playgroud)

代码会导致运行时出现.在VS - 中vector iterators incompatible.有人能说出原因是什么吗?

谢谢

Cae*_*sar 7

std::vector::erase将a返回iterator到列表的下一个位置,因此当您执行擦除时,应使迭代器等于返回的值.

你唯一需要考虑的是返回的结果iterator可能是结束,所以你应该检查一下.

我个人喜欢做的是在擦除后我得到下一个迭代器位置,我回到返回迭代器的前一个位置,然后调用继续 for loop

例:

#include <vector>
#include <iostream>

int main()
{
    std::vector<int> myInt;
    myInt.push_back(1);myInt.push_back(2);myInt.push_back(3);

    for(auto iter = myInt.begin();
        iter != myInt.end();
        ++iter)
    {
        if(*iter == 1)
        {
            iter = myInt.erase(iter);
            if(iter != myInt.begin())
            {
                iter = std::prev(iter);
                continue;
            }
        }

        std::cout << *iter << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是在迭代器循环中进行擦除是不受欢迎的,因为它使旧的迭代器无效,如果你没有计划它们,可能会导致很多问题.

  • @Yakov:`erase`不仅使它被调用的迭代器无效,它使指向其后的位置的每个迭代器无效. (4认同)