您的位置:

vector使用详解之erase()

一、erase()函数的概述

erase()函数是vector容器的一个成员函数,用于删除(擦除)某些元素。该函数有两个参数:要删除元素的迭代器范围。如果只提供一个迭代器,则被删除的是该迭代器所指向的元素。


vector
    v{ 1, 2, 3, 4, 5 };
v.erase(v.begin() + 2);

   

上面这个例子,将删除v中的第3个元素。

二、erase()函数的使用方法

1、擦除单个元素

如果只需要删除一个元素,则可直接指定该元素在vector中的迭代器。


vector
    v{ 1, 2, 3, 4, 5 };
auto it = v.begin();
++it;
v.erase(it);

   

上面这个例子,将擦除v中的第2个元素。

2、擦除一个范围的元素

如果需要擦除多个元素,则需指定要删除的元素范围,即两个迭代器之间的范围。


vector
    v{ 1, 2, 3, 4, 5 };
auto it1 = v.begin() + 1;
auto it2 = v.begin() + 3;
v.erase(it1, it2);

   

上面这个例子,将擦除第2个到第4个元素。

三、erase()函数的实现原理

erase()函数实际上是通过调用底层元素的析构函数来移除元素,并由容器对象的内部实现机制自动维护容器大小和内存空间。在擦除元素之后,原来位于该元素之后的所有元素都将向前移动一个位置。


vector
    v{ 1, 2, 3, 4, 5 };
auto it = v.begin() + 1;
v.erase(it);

   

上面这个例子,将删除v中的第2个元素。擦除过程如图:

擦除范围时,底层元素将被逐个析构,并向前移动,以填补擦除的空间。


vector
    v{ 1, 2, 3, 4, 5 };
auto it1 = v.begin() + 1;
auto it2 = v.begin() + 3;
v.erase(it1, it2);

   

上面这个例子,将擦除第2个到第4个元素。擦除过程如图:

四、erase()函数的注意事项

1、迭代器失效问题

使用erase()函数擦除元素时,要注意迭代器失效的问题。


vector
    v{ 1, 2, 3, 4, 5 };
auto it = v.begin() + 1;
v.erase(it);
v.erase(it); // 迭代器it已失效

   

上面这个例子中,第二次使用erase()函数时,迭代器it已失效,会产生未定义的行为。正确的做法是重新获取迭代器。


vector
    v{ 1, 2, 3, 4, 5 };
auto it = v.begin() + 1;
v.erase(it);
it = v.begin() + 2;
v.erase(it);

   

2、擦除空vector

当vector为空时,调用erase()函数是未定义的行为。


vector
    v;
v.erase(v.begin()); // 未定义的行为

   

应该在使用erase()函数前,先判断vector是否为空。


vector
    v;
if (!v.empty()) {
    v.erase(v.begin());
}

   

3、使用remove或remove_if算法删除元素

当需要删除不连续的元素时,建议使用remove或remove_if算法。


vector
    v{ 1, 2, 3, 4, 5 };
v.erase(remove(v.begin(), v.end(), 2), v.end());

   

上面这个例子中,将删除v中值为2的元素。remove算法将需要保留的元素移动到vector的前面。返回值为新的结束迭代器,表明保留元素的范围。erase()函数用来删除不需要保留的元素。

五、总结

erase()函数是vector容器的一个成员函数,用于删除(擦除)某些元素。它有两个参数:要删除元素的迭代器范围。如果只提供一个迭代器,则被删除的是该迭代器所指向的元素。在擦除元素之后,原来位于该元素之后的所有元素都将向前移动一个位置。使用erase()函数擦除元素时,要注意迭代器失效和空vector问题。当需要删除不连续的元素时,建议使用remove或remove_if算法。