vector删除元素之pop_back(),erase(),remove()

2023-05-16

 

---- 向量容器vector的成员函数pop_back()可以删除最后一个元素.

---- 而函数erase()可以删除由一个iterator指出的元素,也可以删除一个指定范围的元素。

---- 还可以采用通用算法remove()来删除vector容器中的元素,大家可以看到这里说的是算法,而不是方法;

     即vector没有remove()成员,这里的remove是algorithm中的remove函数。

---- 不同的是:采用remove()一般情况下不会改变容器的大小,而pop_back()与erase()等成员函数会改变容器的大小。

1、pop_back()

void pop_back();

Delete last element,Removes the last element in the vector, effectively reducing the container size by one.

删除容器内的最后一个元素,容器的size减1.

This destroys the removed element. 销毁删除的元素

#include <iostream>
#include <vector>
#include <stdio.h>
using namespace std;
int main()
{
	vector<int> vec;
	int sum = 0, i = 0;
	vec.push_back(10);
	vec.push_back(20);
	vec.push_back(30);
	cout << "init vec.size() =  "<< vec.size() << endl;
	while(!vec.empty())
	{
		i++;
		sum += vec.back();	//取最后一个元素	
		vec.pop_back();         //删除最后一个元素
		printf("after %d time, sum: %d size = %d\n", i, sum, vec.size());		
	}
	system("pause");
	return 0;
}

2、erase()

C++98

iterator erase (iterator position);
iterator erase (iterator first, iterator last);

C++11

iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);

删除指定位置的一个元素或删除指定范围内的元素

Removes from the vector either a single element (position) or a range of elements ([first,last)).  包括first,不包括last。
This effectively reduces the container size by the number of elements removed, which are destroyed. 这个操作会让容器的size减小,减小的个数为删除的元素个数。

迭代器用于erase删除元素后,其后会失效,即不能再用该迭代器操作向量。

第一个erase()的例子

#include <iostream>
#include <vector>
#include <stdio.h>
using namespace std;
int main()
{
	vector<int> vec;
	for( int i = 0; i < 10; i++ )
	{
		vec.push_back( i );
	}
	printf("init vec size: %d\n", vec.size());   //0-9
	
	vec.erase( vec.begin() + 5 );                //删除第6个元素,{0 1 2 3 4 6 7 8 9}
	printf("after erase size: %d\n", vec.size());//9
	vec.erase( vec.begin(), vec.begin() + 3 );   //删除第1个元素,到第4个元素 {3 4 6 7 8 9}
	printf("vec = { ");
	for( unsigned int j = 0; j < vec.size(); j++ )
	{
		
		printf("%d ", vec[j]);
	}
	printf("}\n");
	
	system("pause");
	return 0;
}

第二个erase()的例子

#include <iostream>
#include <vector>
#include <stdio.h>
using namespace std;
int main()
{
	vector<int> vec;
	vec.push_back(100);
	vec.push_back(300);
	vec.push_back(300);
	vec.push_back(300);
	vec.push_back(300);
	vec.push_back(500);
	cout << &vec << endl;
	vector<int>::iterator itor;
	for( itor = vec.begin(); itor != vec.end(); itor++ )
	{
		if( *itor == 300 )
		{
			itor = vec.erase(itor);
		}
	}

	for( itor = vec.begin(); itor != vec.end(); itor++)
	{
		cout<< *itor <<" ";
	}	
	system("pause");
	return 0;
}

解析:

1)初始化后,即调用push_back之后,vec中的元素是{ 100 300 300 300 300 500 }

2)迭代器itor指向第一个元素100,不满足条件,itor++;

     迭代器itor指向第二个元素300,满足条件,调用erase删除300,之后vec是{ 100  300 300 300 500 }

     迭代器itor++,指向第三个元素,会调过一个300,满足条件,调用erase,删除300,之后vec是 { 100 300 300 500 }

     迭代器itor++,指向第四个元素,指向500,所以最终vec中的数据就是{ 100 300 300 500 }

3)主要是vec中的数据不断变化,但是itor的指向一直在增加的缘故

那怎么改善这个问题呢?如果我想删除容器中所有的300,应该怎么做?

#include <iostream>
#include <vector>
#include <stdio.h>
using namespace std;
int main()
{
	vector<int> vec;
	vec.push_back(100);
	vec.push_back(300);
	vec.push_back(300);
	vec.push_back(300);
	vec.push_back(300);
	vec.push_back(500);
	vector<int>::iterator itor = vec.begin();
	while( itor != vec.end() )
	{
		if( *itor == 300 )
		{
			itor = vec.erase(itor);
		}
		else
		{
			itor++;
		}
	}
	printf("vec = { ");
	for( itor = vec.begin(); itor != vec.end(); itor++)
	{
		cout<< *itor <<" ";
	}	
	printf("}\n");

	system("pause");
	return 0;
}

3、remove()

先来抄写一段吧:我们可以选择STL方法(特定类的成员函数)或STL函数,通常方法是更好的选择。首先,它更适合于特定的容器;其次,作为成员函数,它可以使用模板类的内存管理工具,从而在需要时调整容器的长度。

例如:假设有一个由数字组成的链表,并要删除链表中某个特定值(4)的所有实例。如果mylist是一个list<int>对象,则可以使用链表的remove()方法。

mylist.remove(4);   //remove all 4 from the list

调用该方法后,链表中所有值为4的元素都将被删除,同时链表的长度将被自动调整。

还有一个名为remove()的STL函数(算法),它不是由对象调用,而是接受区间参数。因此,如果mylist是一个list<int>对象,则调用该函数的代码如下:

remove(mylist.begin(), mylist.end(), 4);

然而,由于该remove()函数不是成员,因此不能调整链表的长度。它将没被删除的元素放在链表的开始位置,并返回一个指向新的超尾值的迭代器。

来举个例子吧

#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
#include <stdio.h>
using namespace std;

void Show(int v)
{
	std::cout << v << ' ';
}

int main()
{
        int age[10] ={ 2, 3, 5, 4, 2, 3, 2, 6, 2, 7 };
	std::list<int> list_a(age, age + 10);
	std::list<int> list_b(list_a);
	printf("Original list_a:\n");
	for_each(list_a.begin(), list_a.end(), Show);
	printf("\n\n");
	list_a.remove( 2 );
	printf("remove() method list_a:\n");
	for_each(list_a.begin(), list_a.end(), Show);
	printf("\n\n");
	list<int>::iterator itor;
	itor = remove(list_b.begin(), list_b.end(), 2);
	printf("remove() function list_b:\n");
	for_each(list_b.begin(), list_b.end(), Show);
	printf("\n\n");
	list_b.erase( itor, list_b.end() );
	printf("erase() method list_b:\n");
	for_each(list_b.begin(), list_b.end(), Show);
	printf("\n");
	system("pause");
	return 0;
}

vector同理:

#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
#include <stdio.h>
using namespace std;

void Show(int v)
{
	std::cout << v << ' ';
}

int main()
{
	int age[10] ={ 2, 3, 5, 4, 2, 3, 2, 6, 2, 7 };
	vector<int> vec_a(age, age + 10);
	printf("Original vec_a:\n");
	for_each(vec_a.begin(), vec_a.end(), Show);
	printf("\n\n");
	
	vector<int>::iterator itor;
	itor = remove(vec_a.begin(), vec_a.end(), 2);
	printf("remove() function vec_a:\n");
	for_each(vec_a.begin(), vec_a.end(), Show);
	printf("\n");
	printf("remove() size: %d\n\n", vec_a.size());
	vec_a.erase( itor, vec_a.end() );
	printf("erase() method vec_a:\n");
	for_each(vec_a.begin(), vec_a.end(), Show);
	printf("\n");
	printf("erase() size: %d\n\n", vec_a.size());
	system("pause");
	return 0;
}

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

vector删除元素之pop_back(),erase(),remove() 的相关文章

  • 用Android的Activity生命周期解释HarmonyOS的Page Ability生命周期

    由华为出品 我国完全自主知识产权的HarmonyOS是一款 面向未来 面向全场景 xff08 移动办公 运动健康 社交通信 媒体娱乐等 xff09 的分布式操作系统 现已于2020年9月10日开源 xff0c 并面向应用开发者发布Beta版
  • 宗师级Linux 系统管理员的倾囊相授——《Linux命令行与shell脚本编程大全(第4版)》

    信息安全 早已上升为国家战略 xff0c 发展自主可控的国产操作系统迫在眉睫 为了满足国防 公安等涉密领域对操作系统平台的安全需求 xff0c 国防科技大学研制了以操作系统技术为核心 xff0c 安全可信为特色的中标麒麟 xff08 Ubu
  • Java语言的极限,就是面向对象的极限——《On Java中文版》

    自从1995年问世以来 xff0c Java已经发展成了全世界使用范围最广的语言之一 xff0c 每天都有30亿台运行Java的设备活跃在这个世界上的各个角落里 世界上大多数网站的后台使用Spring开发 xff0c 而Spring开发者必
  • 展望10年内VR技术的盈利模式的发展历程

    2016年被誉为中国VR元年 xff0c VR也成为了就像2012年的团购 2013年的P2P 2014年的O2O 2015年的大数据一样成为了创客们在咖啡厅里向投资人侃侃而谈的网络流行语 情 xff08 gen xff09 怀 xff08
  • 做后台开发用到的技能都在这儿——《后台开发:核心技术与应用实践》

    大多数面向对象语言没有指针的概念 xff0c C语言也没有对象的概念 xff0c 同时具有指针和对象的 C 43 43 语言在学习时有高昂的门槛 xff0c 同时在服务端后台开发 处理多并发的海量网络请求等方面有天然的优势 就像 Andro
  • Android Canvas 多张图片拼接成长图

    容我慢写
  • Android Canvas 给图片加上水印

    容我慢写
  • 我做面试官的故事

    2016年就要过完了 xff0c 我入行也快三年了 三年来被人面试过也面试过人 xff0c 我来给大家分享一下我面试别人的两个有趣经历吧 xff1a 1 有一天我穿着环信的T恤 xff0c 前胸是一个巨大的环信logo xff0c 后颈是环
  • 2016年点亮的新技能树——指导·招聘·业务

    2015年入职的公司刚倒闭 xff0c 一家公司招我进去带俩新人做项目 xff0c 我刚来了没半个月他俩都跑了 我成了2016年春夏之交的CSDN首页上 到新公司带新人 xff0c 新人跑了 的笑话 这个故事是有续集的 xff0c 他俩跑了
  • 给CheckBox加上动画

    容我慢写
  • SEC物权链奖金制度分析

    启程SEC物权链是什么 xff1f 靠谱吗 xff1f SEC公链是什么 xff1f 物权链怎么样 xff1f 分析于下 xff1a 一 定位 xff1a 依托原中小企业上市包装辅导策划以及不良资产运作等业务 xff0c 130家实体资产分
  • Linux安装pqsql

    PostgreSQL安装部署 1 解压 tar xvf postgresql 10 5 1 linux x64 binaries tar gz 将解压文件重命名 mv pgsql postgresql PostgreSQL无法在root用户
  • 高考失败的程序员的逆袭

    高考作文不得出现真实的校名和人名 xff0c 所以本文不包含任何真实的校名 人名乃至赞助学校的企业名 xff0c 小说情节纯属虚构 如果情节与现实生活的事实雷同 xff0c 请谨记 xff1a 英国有个人叫牛顿 xff0c 德国有个人叫莱布
  • Android程序员的十大转型之路

    IT行业是一个瞬息万变的行业 xff0c 程序员是一个不进则退的职业 我作为一个Android程序员 xff0c 多年来一直保持随时可以转型其他技术领域的状态 xff0c 保持对新技术敏感的嗅觉 我先说说Android程序员不可能转型的几个
  • 【玖哥乱弹】编程语言间的斗争

    在初级程序员阶段 xff0c 每个人都不可避免遇到选择编程语言和职业方向的难题 我挑选了几个常见的编程语言 xff0c 分析了优缺点和职业方向 xff0c 以供想当程序员的人参考 C C 43 43 一句话概括 xff1a 大多数中国程序员
  • 【玖哥乱弹】成功的IT人士这样转型AI

    AlphaGo在与围棋世界冠军的对弈大获全胜 xff0c 不但让我们领略到了AI的巨大潜力 xff0c 还把AI推上了新的浪潮之巅 作为一个从即将过去的移动互联网时代走来的Android工程师 xff0c 我深深感受到自己成了传统行业 xf
  • 【玖哥乱弹】程序员如何成为别人的男朋友

    这个世界上程序员数量很多 xff0c 有女朋友的程序员在其中的比例却很少 究其原因 xff0c 不外乎大多数程序员根本不知道怎么才能成为别人的男朋友 成为别人的男朋友对于富二代和拆迁户很容易 xff0c 而对于程序员却很难 xff0c 潘驴
  • Linux库函数之opendir/closedir/readdir

    在Linux环境下 xff0c 有时候需要编写一些实用的工具 xff0c 比如检索功能 xff0c 最近在做病毒查杀应用开发 xff0c 涉及到批量扫描指定目录下文件 xff0c 因为要测试大量病毒文件 xff0c 该部分功能又是要通过AP
  • 编译ROS包出现错误 提示:invoking &quot;make cmake_check_build_system&quot; failed

    问题原因 xff1a 不同包里不允许有重名的节点 解决方案 xff1a 编辑重复的package文件夹里的CMakeLists txt文件 xff0c 对涉及到节点名称的代码进行修改 调试过程 xff1a 逐行分析问题代码 xff0c 问题
  • Centos7.X添加本地至Docker用户组

    根据上篇文章 Centos7 X通过rpm包安装Docker 安装好Docker之后 xff0c 发现必须使用sudo提权的方式或者直接使用root方式才能操作docker xff0c 实际上我们平常登录都是自己的账户 xff0c 这样操作

随机推荐

  • pytorch填坑:RuntimeError: cudnn RNN backward can only be called in training mode

    运行pytorch时 xff0c 训练很正常 xff0c 但是如果切换到eval 模式之后再继续训练 xff0c 发现报错 xff1a RuntimeError cudnn RNN backward can only be called i
  • Linux Mint 18.2安装VMware Workstation Pro 12

    VMware Workstation xff08 中文名 威睿工作站 xff09 是一款功能强大的桌面虚拟计算机软件 xff0c 提供用户可在单一的桌面上同时运行不同的操作系统 xff0c 和进行开发 测试 部署新的应用程序的最佳解决方案
  • ubuntu 使用nginx和gunicorn 部署服务

    1 安装gunicorn pip install gunicorn 2 创建下列名为web py的文件 xff1a from flask import Flask app 61 Flask name 64 app route 39 39 d
  • unable to execute ':/usr/local/cuda/bin/nvcc': No such file or directory

    仔细看下面的错误 xff1a unable to execute 39 usr local cuda bin nvcc 39 No such file or directory 是多了一个冒号 解决方式 xff1a vi bashrc 将
  • ubuntu系统设置ssh连接端口

    1 sudo vim etc ssh sshd config 将其中的 Port 22行取消注释 xff0c 并且将22换成自己想要的端口 xff0c 例如5677等 2 重启ssh服务 systemctl restart sshd net
  • anaconda 环境查找虚拟环境

    1 查找虚拟环境 conda info envs 会出现如下结果 2 选择虚拟环境 source activate tensorflow p36 3 退出虚拟环境 source deactivate 4 安装librosa conda in
  • python logging.info在终端没输出

    问题描述 在pyhton脚本中logging info 34 hello world 34 希望输出 39 hello world 39 但是在终端没有输出 解决方法 在文件开始的地方添加以下内容 span class pln style
  • ImportError: libSM.so.6: cannot open shared object file: No such file or directory解决

    运行如下命令即可解决 span class pln style margin 0px padding 0px border 0px font style inherit font weight inherit font size 6 lin
  • linux 查看版本信息

    1 uname xff0d a xff08 Linux查看版本当前操作系统内核信息 xff09 Linux ml 4 4 0 109 generic 132 Ubuntu SMP Tue Jan 9 19 52 39 UTC 2018 x8
  • 你真的了解串口吗(示波器串口波形分析)

    串口是最常用的外设了 xff0c 串口基本都是单片机的标配 串口通信只需要3条线组成 xff0c 分别为RX TX GND 下面将重点分析串口数据帧组成 一 串口通信帧 串口通信帧数据如此 xff0c 每帧由空闲位 起始位 数据位 校验位
  • C++——类和对象(4)

    作者 xff1a 几冬雪来 时间 xff1a 2023年5月6日 内容 xff1a C 43 43 类和对象内容讲解 目录 前言 xff1a 1 运算符重载 xff08 续 xff09 xff1a 2 赋值重载 xff1a 结尾 xff1a
  • Shell脚本-NF、FS(OFS)、RS(ORS)、NR(FNR)

    1 NF xff1a number of fileds xff08 字段 域的个数 xff09 整数 NF xff1a 取最后一列的字符串 xff0c 等同于 1 2 xff0c NF 1 NF等等 来看个例子吧 kdvmt 64 kdvm
  • 七月历程

    六月底老师通知让我提前返校 xff0c 去长春自我隔离一段时间 xff0c 这几天一直在收拾东西 空余时间没用来学习 xff0c 不过倒是上 steam 上买了个游戏 QAQ 2020 是个多灾多难的年份 澳洲火灾 xff0c 东非蝗虫肆虐
  • Shell脚本 - cut、sort、paste

    1 cut xff1a 用来提取文件的片段 d 后面指定分隔的符号 f 指定显示第几列 c 后面跟显示的字符1 n xff0c character b 后面根据显示的字节 xff0c byte kdvmt 64 kdvmt temp cat
  • 儿童诗词学习

    鹿寨 xff08 王维 xff09 空山不见人 xff0c 但闻人语响 返景入深林 xff0c 复照青苔上 独坐敬亭山 xff08 李白 xff09 众鸟高飞尽 xff0c 孤云独去闲 相看两不厌 xff0c 只有敬亭山 杂诗 xff08
  • 分页存储管理中的页表项长度是什么?

    看到很多人有疑问 xff1f 读到这里的时候我也有疑问的 在操作系统的分页存储管理方式中 xff0c 写道 xff1a 将页表始址与页号和页表项长度的乘积 相加 xff0c 便得到该表项在页表中的位置 于是可从中得到该页的物理块号 xff0
  • apt-get和aptitude

    1 apt get apt get是一条linux命令 xff0c 适用于deb包管理式的操作系统 xff0c 主要用于自动从互联网的软件仓库中搜索 安装 升级 卸载软件或操作系统 Advanced Package Tool xff0c 又
  • SPOOLing技术

    虚拟性是OS的四大特征之一 如果说可以通过多道程序技术 将一台物理CPU虚拟为多台 逻辑CPU xff0c 从而允许多个用户共享一台主机 xff0c 那么通过SPOOLing技术 便可将一台物理I O设备虚拟为多台 逻辑I O设备 xff0
  • C语言 gets()和scanf()函数的区别

    scanf 函数和gets 函数都可用于输入字符串 xff0c 但在功能上有区别 若想从键盘上输入字符串 34 hi hello 34 xff0c 则应该使用gets 函数 gets可以接收空格 xff1b 而scanf遇到空格 回车和Ta
  • vector删除元素之pop_back(),erase(),remove()

    向量容器vector的成员函数pop back 可以删除最后一个元素 而函数erase 可以删除由一个iterator指出的元素 xff0c 也可以删除一个指定范围的元素 还可以采用通用算法 remove 来删除vector容器中的元素 x