C++ STL list删除元素

一、方法

函数说明
pop_front()删除位于 list 容器头部的一个元素
pop_back()删除位于 list 容器尾部的一个元素
erase()该成员函数既可以删除 list 容器中指定位置处的元素,也可以删除容器中某个区域内的多个元素。
clear()删除 list 容器存储的所有元素
remove(val)删除容器中所有等于 val 的元素
unique()删除容器中相邻的重复元素,只保留一份
remove_if()删除容器中满足条件的元素

1、erase

格式说明
iterator erase (iterator position);删除 list 容器中 position 迭代器所指位置处的元素
iterator erase (iterator first, iterator last);删除 list 容器中 first 迭代器和 last 迭代器限定区域内的所有元素(包括 first 指向的元素,但不包括 last 指向的元素)

2、unique

格式说明
void unique()去除 list 容器中相邻重复的元素
void unique(BinaryPredicate)去除 list 容器中相邻重复的元素,仅保留一份

二、实例

这里主要是unique()和remove_if()的使用

1、unique()

 std::list<int> listInt1{ 16,72,72,100,72,109,203,671,109,192,671 }, listInt2{9,201,94,43,67,81,901};

    **listInt1.unique();**
    int i = 0;
    std::list<int>::iterator listIter1 = listInt1.begin();
    for (; listIter1 != listInt1.end(); listIter1++)
    {
        std::cout << " unique listInt1[" << i++ << "]=" << *listIter1 << std::endl;
    }

结果如下:
image.png
由结果可知:
①只能比较相邻两个元素,若连续三个或以上元素值相同也适用

bool test(int first, int second)
{
    return (first <= second);
}


std::list<int> listInt1{ 72,73,100,72,44,48,109,92,671,15,192,671 };

listInt1.unique(test);
int i = 0;
std::list<int>::iterator listIter1 = listInt1.begin();
for (; listIter1 != listInt1.end(); listIter1++)
{
    std::cout << " unique listInt1[" << i++ << "]=" << *listIter1 << std::endl;
}

结果如下:
image.png
由结果可知
当执行test返回true时,会删除元素
返回false时,会保留比较的两个元素值
如:{ 72,73,100,72,44,48,109,92,671,15,192,671 }的比较步骤是
①72,73返回true,删除73;72,100返回true,删除100;72,72返回true,删除72
②72,44返回false,保留72,44
③44,48返回true,删除48;44,109返回true,删除109;44,92返回true,删除92;44,671返回true,删除671
④44,15返回false,保留15
⑤15,192返回true,删除192;15,671返回true,删除671
因此最后list中的数据为{72.44.15}
注意:
除了以上谓词函数的方式,还可以使用 lamba表达式以及函数对象的方式定义。

2、remove_if

std::list<int> listInt1{ 72,73,100,72,44,48,109,92,671,109,15,671 };

listInt1.remove_if([](int nValue) {return nValue < 100; });
int i = 0;
std::list<int>::iterator listIter1 = listInt1.begin();
for (; listIter1 != listInt1.end(); listIter1++)
{
    std::cout << " unique listInt1[" << i++ << "]=" << *listIter1 << std::endl;
}

或者

//二元谓词函数
bool test(int nValue)
{
    bool bRet =  (nValue < 100);
    return bRet;
}

std::list<int> listInt1{ 72,73,100,72,44,48,109,92,671,109,15,671 };

listInt1.remove_if(test);
int i = 0;
std::list<int>::iterator listIter1 = listInt1.begin();
for (; listIter1 != listInt1.end(); listIter1++)
{
    std::cout << " unique listInt1[" << i++ << "]=" << *listIter1 << std::endl;
}

结果如下:
image.png
大于等于100的元素值都会被保留

小菜鸟一枚,望各位大佬不吝指教,用于记录学习

1 声望
0 粉丝
0 条评论
推荐阅读
C++ STL multiset容器
multiset 类模板提供的构造函数,和 set 类模板中提供创建 set 容器的构造函数,是完全相同的。因此创建set容器的方式适用于创建multiset容器。具体的方法参考set容器:[链接]

等待樱花盛开阅读 968

python里打印list的四种方法
原文链接标题:Print lists in Python (4 Different Ways)用for循环来打印 {代码...} 结果1 2 3 4 5用 * 星号来打印 {代码...} 结果 {代码...} 把list转换为str来打印 {代码...} 结果 {代码...} 用map把数组里非...

chiiinnn阅读 10.2k

封面图
麒麟操作系统 (kylinos) 从入门到精通 - 研发环境 - 第二十一篇 C++/C语言开发环境搭建
类别:笔记本型号:中国长城 NF14C硬件平台:飞腾处理器(ArmV8 指令集)系统:银河麒麟操作系统 V10 SP1(2203) 关键词:信创,麒麟系统,linux,c++,c,内核飞腾,arm

码上世界1阅读 2.3k评论 1

封面图
万字避坑指南!C++的缺陷与思考(下)
导读 | 在万字避坑指南!C++的缺陷与思考(上)一文中,微信后台开发工程师胡博豪,分享了C++的发展历史、右值引用与移动语义、类型说明符等内容,深受广大开发者喜爱!此篇,我们邀请作者继续总结其在C++开发过...

腾讯云开发者4阅读 474评论 1

java开发中遇到的一些问题
1.1HashMap存key,value,key会有重复的,value会有多个值,选取此方式进行存取,动态获取key,value取list,若满足条件,list一直add,key覆盖掉之前的,list一直在增加。

Jackson阅读 1.1k

一种将函数模板定义和声明分开的方法
&emsp;&emsp;在 C++ 中为了操作简洁引入了函数模板。所谓的函数模板实际上是建立一个通用函数,其函数类型或形参类型不具体指定,用一个虚拟的类型来表达,这个通用函数就称为函数模板。

Sharemaker阅读 856

封面图
Workflow的JSON解析器
Workflow中有一个小而美的json-parser,一千行代码写得非常典雅精致。不仅可以学习到经典的C语言写法、递归解析的架构、与内核近似的编码风格、简洁的接口设计,而且也非常方便引入项目中作为轻量级的json解析器...

1412阅读 794

小菜鸟一枚,望各位大佬不吝指教,用于记录学习

1 声望
0 粉丝
宣传栏