C++ STL vector成员删除(四)

删除

iterator erase(iterator it); //删除指定位置position的元素,并返回删除元素的下一个元素的迭代器


vector<int> v1{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10};

for (auto p1 = v1.begin(); p1 != v1.end(); p1++)
{
    if (*p1 == 9)
    {
        v1.erase(p1);
    }
}

里面隐藏着一个很严重的错误:当v1.erase(iter)之后,v1变成了一个野指针,对一个野指针进行 iter++ 是肯定会出错的。
vector<int> v1{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10};
for(vector<int>::iterator iter=v1.begin(); iter!=v1.end(); iter++)
{
    if(*iter == 10)
        iter = v1.erase(iter);
}

这段代码也是错误的:
1) 如果删掉的是最后一个元素,返回.end()
2)无法删除两个连续的"10"; 
3)当10位于vector最后位置的时候,也会出错(在返回的野指针上iter = v1.end()上执行++ 操作)
为了避免对野指针进行操作,一种解决方法如下:
vector<int> v1{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10};
for(vector<int>::iterator iter=v1.begin(); iter!=v1.end(); )
{
     if( *iter == 10)
     {   
           itor2=iter; //临时变量
           v1.erase(itor2);
     }
      else
           iter ++ ;
}

另外一种:
vector<int> v1{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10};
for (auto p1 = v1.begin(); p1 != v1.end(); p1++)
{
	if (*p1 == 9)
	{
		v1.erase(p1);
		p1 = v1.begin();
	}
}

for (auto p1 = v1.begin(); p1 != v1.end(); p1++)
{
	cout << *p1 << "; "; //1; 2; 3; 4; 5; 6; 7; 8; 10; 10;
}
cout << endl; 

 void clear();清空向量中所有元素

C++ STL vector成员删除(四) C++ STL vector成员删除(四)

 iterator erase(iterator first, iterator last);//删除从first到last(不包过last)之间的元素 [first,last),并返回last位置迭代器

C++ STL vector成员删除(四)

 void pop_back(); 删除向量中最后一个元素

C++ STL vector成员删除(四)