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.有人能说出原因是什么吗?
谢谢
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)
但是在迭代器循环中进行擦除是不受欢迎的,因为它使旧的迭代器无效,如果你没有计划它们,可能会导致很多问题.