跟我学C++中级篇——STL中的删除

本文主要分析了C++ STL中两种常见的删除方式,即全局的std::remove和容器自带的erase。std::remove并未真正删除数据,只是移动;erase有删除指定位置和范围元素两种用法。还介绍了二者混合使用的情况,并给出例程,最后总结强调要弄清楚删除函数的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、介绍

在STL中一般删除的方式有两类,一种是使用全局的std::remove(remove_if类似),一种是使用容器自带的erase,前者其实并没有真正的删除数据,而后者则是在移动时,会有一些细节的处理,否则要么程序崩溃,要么达不到删除的目的。下面就这两个函数进行一下分析说明。
在一些容器中也提供了remove(如std::list)方法,它和全局的std::remove还是用法区别不小的,这个大家需要自己看一下。
注:C++20提供了std::erase这种更方便的用法

二、std::remove和 erase

1、std::remove
它的定义很简单:

template< class ForwardIt, class T >
ForwardIt remove( ForwardIt first, ForwardIt last, const T& value );(C++20)
template< class ForwardIt, class T >
constexpr ForwardIt remove( ForwardIt first, ForwardIt last, const T& value );(C++20)
template< class ExecutionPolicy, class ForwardIt, class T >
ForwardIt remove( ExecutionPolicy&& policy,
                  ForwardIt first, ForwardIt last, const T& value );

其功能是实现删除在迭代器指定的范围内的所有满足条件的元素并返回尾后迭代器。需要说明的,这里的删除并未真正删除,只是移动,可以在下面的例程中看到相关的示例代码。
2、erase
看一下vector中的定义:

iterator erase( iterator pos );(until C++11)
iterator erase( const_iterator pos );(since C++11)(until C++20)
constexpr iterator erase( const_iterator pos );(since C++20)(2) 	
iterator erase( iterator first, iterator last );(until C++11)
iterator erase( const_iterator first, const_iterator last );(since C++11)(until C++20)
constexpr iterator erase( const_iterator first, const_iterator last );(since C++20)

它的定义很明显,有两种用法,一种是删除指定位置的元素,一种是删除指定范围的元素。这次之所以总结一下,就是因为发现错误的删除方式不再崩溃。所以得到的结论是,有时崩溃,有时不崩溃,看环境。

3、二者混合
其实就是移动并删除被删除的元素,有点拗口。就是将remove移动后的元素,不再使用的空间内的元素真正删除并和迭代器等自然挂钩。看下面的例子就会明白。

三、例程

例程是以std::vector做为例程的,其它的容器可能细节上会有一些差别,但总体上的应用是一致的。感兴趣可以把其它的几个容器都试一下。

#include <algorithm>
#include <cctype>
#include <iostream>
#include <string>
#include <vector>

void testErase2() {
   
  std::vector<int> vec{
   1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值