如何在不复制迭代器和没有内存泄漏的情况下擦除STL向量中的元素?

Rag*_*u G -5 c++ memory iterator stl vector

这是编辑过的代码

vector<vector<int> > vec; 
vector<vector<int> >::iterator vit; 
vector<int>::iterator it;
for ( vit = vec.begin(); vit != vec.end(); ++vit)
{
    it = vit->begin();
    while(it != vit->end()) 
    {
        while(it != vit->end())
        {

            if( condition )
            {
                while( condition )
                {
                    //going back to certain it
                    //erase an element
                    it  = vit->erase(it);
                }
            }
            else
                ++it;
        }
        ++it;
    }
}
Run Code Online (Sandbox Code Playgroud)

内在的同时循环回到某一点.链接丢失.擦除元素而不复制迭代器并且在后循环中没有内存泄漏并再次向前移动?

Pix*_*ist 6

如果你想删除内部向量的某些元素,请在它们上使用erase-remove惯用法:

for (auto & intv : vec)
{
  intv.erase( 
    std::remove_if( intv.begin(), intv.end(), 
      [](int value) -> bool { return value == 2; }), 
    intv.end() );
}
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. 您可以vec通过在lambda表达式中捕获它们来应用某些条件或其他局部变量.

  2. 此示例将从内部向量中删除所有等于的元素2.

  3. 因为int最好按值传递lambda参数.对于更大的对象,您可能希望拥有一个const引用lambda参数.