C++的 remove函数

2023-05-16

一、介绍

remove函数原型如下:

template< class ForwardIt, class T >
ForwardIt remove( ForwardIt first, ForwardIt last, const T& value );

remove函数会将[first, last)范围内所有等于value的值移动到尾部,返回一个指向新的最后一个元素之后的位置的迭代器,源代码如下:

template <class ForwardIterator, class T>
  ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val)
{
      ForwardIterator result = first;
      while (first!=last) {
        if (!(*first == val)) {
          *result = std::move(*first); //移动待删除元素后面的元素
          ++result;
        }
        ++first;
      }
      return result;
}

二、实例

测试remove

int main()
{
    vector<char> vec = { 'A','A','A','B','C','D','E','A','A' };

    // 删除所有的A,执行remove函,返回一个迭代器position
    vector<char>::iterator position = remove(vec.begin(), vec.end(), 'A');

    // 打印执行remove后,当前数组的值
    cout << "执行remove后,当前的数组" << " ";
    for (auto ite = vec.begin(); ite != vec.end(); ++ite)
    {
        cout << *ite << " ";
    }
    cout << endl;

    cout << "remove函数返回的迭代器的值为:"<< *position << endl;

    cout << "remove函数返回的迭代器与数组的end迭代器之间的距离为:" << vec.end() - position << endl;

    // 打印position 到 vec.end()之间的所有元素
    cout << "position 到 vec.end()之间的所有元素为";
    for (auto ite = position; ite != vec.end(); ++ite) 
    {
        cout << *ite << " ";
    }
    cout << endl;
    system("pause");
    return 0;
}

 分析:

读源码我们知道,remove删除的时候只是通过迭代器的指针移动来改变数据的位置,而不是真的删除数组中的数据。所以执行完remove后,打印B C D E C D E A A就很好理解了。当first指针依次移动时,不等于A,result指针就移动,等于A,result指针就停止。然后first指针继续移动一直到循环结束,返回result指针。当fisrt指针走完的时候,result指针正好走到B C D E C D E A A 的位置C(第二个C)这里,所以得到的position为C,距离end指针为5,postiton 到 end之间的序列就是C D E A A。

如果想在数组中真正的删除A,就使用:

vec.erase( remove(vec.begin(), vec.end(), 'A'), vec.end() );

它相当于将result位置开始往后的空间全部释放掉了,得到的就是BCDE。 

三、与earse的区别

STL中remove()只是将待删除元素之后的元素移动到vector的前端,而不是删除该元素。若要真正移除,需要搭配使用erase()。

erase的作用是删除掉某个位置position或一段区域(begin, end)中的元素,减少其size,返回被删除元素下一个元素的位置。

删除vector中值为val的元素

vec.erase(remove(vec.begin(),vec.end(),val),vec.end());

举个例子:

删除数组中的重复元素,对数组中的重复元素只保留一个,并且对重复的原地移除。

思路:可以将重复的元素用一个特殊值(比如INT_MAX)替代,再统一删除这个特殊值。

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        
        if(nums.size() == 0){
            return 0;
        }

        int res = 1;
        int flag = nums[0];
        for(int i=1;i<nums.size();i++)
        {
            if(nums[i] == flag) {
                nums[i] = INT_MAX;
            }
            else {
                flag = nums[i];
            }
                
        }
        nums.erase(remove(nums.begin(), nums.end(), INT_MAX), nums.end());
        return nums.size();
    }
};

int main()
{
   	vector<int> ans = { 1, 2, 100, 100, 100, 200, 300, 400, 217, 120 };
	Solution sol;
	sol.removeDuplicates(ans);
	for (auto &elem : ans)
	{
		std::cout << elem << " ";
	}
    return 0;

}

 

四、Remove_if()函数

remove_if(beg, end, op) // 移除区间[beg,end)中,每一个“使条件运算:op(elem) == true”的元素;

用法如下:

bool IsSpace(char x) { return x == ' '; } // 判断是否有空格

string str2 = "Text with some  spaces";//移除空格

str2.erase(remove_if(str2.begin(),  str2.end(), IsSpace), str2.end()); 

函数原型: 

template<class ForwardIt, class UnaryPredicate>
ForwardIt remove_if(ForwardIt first, ForwardIt last, UnaryPredicate p)
{
    first = std::find_if(first, last, p);
    if (first != last)
        for(ForwardIt i = first; ++i != last; )
            if (!p(*i))
                *first++ = std::move(*i);
    return first;
}

参考:

vector的remove和erase函数的区别_qvector remove_代码码xzy的博客-CSDN博客

C++中remove()函数总结_Toryci的博客-CSDN博客

https://www.cnblogs.com/cthon/p/9223935.htmlh

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++的 remove函数 的相关文章

随机推荐

  • Opencv安装与环境配置

    转载自 xff1a https blog csdn net sm16111 article details 81238324 Opencv安装与环境配置 代码敌敌畏 2018 07 27 15 46 24 50411 收藏 94 分类专栏
  • 串口参数详解:波特率,数据位,停止位,奇偶校验位

    转载自 xff1a https blog csdn net sinat 35705952 article details 89034455 串口参数详解 xff1a 波特率 xff0c 数据位 xff0c 停止位 xff0c 奇偶校验位 W
  • cpp-httplib库简单原理,听说你还不会开源库?

    cpp httplib库的原理 听说你还不会开源库 xff1f 介绍httplib h头文件的处理流程httplib h头文件的组成httplib h头文件搭建服务端与客户端的原理Get接口listen 0 0 0 0 8989 接口 介绍
  • UART串口调试

    转载自 xff1a https www secpulse com archives 157847 html UART串口调试 脉搏文库 TideSec 2021 04 23 4 356 0x00前言 前段时间陆陆续续的对光猫 路由器 摄像头
  • visca协议及其实现的简单认识

    转载自 xff1a https latelee blog csdn net article details 35811777 visca协议及其实现的简单认识 李迟 2014 06 30 14 09 01 7064 收藏 12 分类专栏 x
  • C语言实现的一个简单的HTTP程序

    转载自 xff1a https www cnblogs com xuwenmin888 archive 2013 05 04 3059282 html C语言实现的一个简单的HTTP程序 以下是参考 lt winsock网络编程经络 gt
  • ideavim使用

    IdeaVim 常用操作 IdeaVim简介 IdeaVim是IntelliJ IDEA的一款插件 xff0c 他提高了我们写代码的速度 xff0c 对代码的跳转 xff0c 查找也很友好 安装之后它在 Tools gt Vim Emula
  • CAN总线——数据传输故障处理

    最近遇到CAN总线通讯的问题 上位机为arm板 xff0c 核心板为Cortex A9处理器 Linux内核 下位机为5块 STM32板 现象为 xff1a 如果上位机只接收数据 xff0c 一切通讯正常 当上位机下发命令 xff0c 那么
  • 升级构建工具,从Makefile到CMake

    更多博文 xff0c 请看音视频系统学习的浪漫马车之总目录 C C 43 43 编译 浅析C C 43 43 编译本质 一篇文章入门C C 43 43 自动构建利器之Makefile 升级构建工具 xff0c 从Makefile到CMake
  • RTKLIB简介

    RTKLIB是全球导航卫星系统GNSS global navigation satellite system 的标准 amp 精密定位开源程序包 xff0c RTKLIB由日本东京海洋大学 xff08 Tokyo University of
  • zzuli OJ 1038: 绝对值最大

    Description 输入3个整数 xff0c 输出绝对值最大的那个数 Input 输入包含3个int范围内的整数 xff0c 用空格隔开 Output 输出三个数中绝对值最大的数 xff0c 单独占一行 若绝对值最大的数不唯一 xff0
  • md5sum

    ERROR 1550456422 414780061 Client Lidar cipv 213 wants topic rs percept result to have datatype md5sum autodrive msgs Pe
  • libcurl实现HTTP

    关于libcurl的相关函数介绍以及参数详见官方说明 https curl haxx se libcurl c example html HTTP Request 一个http请求包含方法 路径 http版本 请求包头 请求方法 GET H
  • 深夜没事,抓个ARP包吧!

    深夜没事 xff0c 抓个ARP包吧 xff01 ipconfig查看网卡信息 选择en33这个网卡 xff0c 发送两次 xff0c 询问192 168 21 1的mac地址 xff0c 注意 xff1a ARP请求只能在同一子网内部进行
  • linux基础篇(一)——GCC和Makefile编译过程

    linux系列目录 xff1a linux基础篇 xff08 一 xff09 GCC和Makefile编译过程 linux基础篇 xff08 二 xff09 静态和动态链接 ARM裸机篇 xff08 一 xff09 i MX6ULL介绍 A
  • jni/ndk问题 :引用so库报错: java.lang.UnsatisfiedLinkError: No implementation found for

    问题 xff1a 引用so库报错 xff1a java span class token punctuation span lang span class token punctuation span UnsatisfiedLinkErro
  • 《python+opencv实践》一、基于颜色的物体追踪(上)

    点击打开链接 本文主要参考国外一大牛博客 xff0c 然后自己修改得来 相关知识点在这里 实现功能 xff1a 追踪红颜色瓶盖 xff0c 并画出瓶盖轮廓和运动轨迹 from collections import deque import
  • C++的sort函数实现字符串排序

    一 背景 sort函数用于C 43 43 中 xff0c 对给定区间所有元素进行排序 头文件是 include lt algorithm gt 实现原理 xff1a sort并不是简单的快速排序 xff0c 它对普通的快速排序进行了优化 x
  • C# 中的Dispose()用法

    一 对Dispose方法的理解是什么呢 xff1f 使用Dispose方法的对象 xff0c 应释放它拥有的所有资源 它还应该通过调用其父类型的Dispose方法释放其基类型拥有的所有资源 net的对象使用一般分为三种情况 1 创建对象 2
  • C++的 remove函数

    一 介绍 remove函数原型如下 xff1a template lt class ForwardIt class T gt ForwardIt remove ForwardIt first ForwardIt last const T a