【STL】list容器的插入与删除

本文详细介绍了C++ STL中list容器的插入与删除操作,包括push_front、push_back、emplace前后、insert、splice等方法,以及erase、remove、unique和remove_if等删除元素的方法。特别强调了list.splice()方法的独特之处,它通过移动节点实现元素的添加,同时从源容器中删除元素。此外,还提到了list容器迭代器的限制。

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

【STL】list容器插入与删除

添加或插入新元素

list成员方法:

  • push_front():向 list 容器首个元素前添加新元素;
  • push_back():向 list 容器最后一个元素后添加新元素;
  • emplace_front():在容器首个元素前直接生成新的元素;
  • emplace_back():在容器最后一个元素后直接生成新的元素;
  • emplace():在容器的指定位置直接生成新的元素;
  • insert():在指定位置插入新元素;
  • splice():将其他 list 容器存储的多个元素添加到当前 list 容器的指定位置处。

list.insert() 方法:

insert 使用与 vector、deque相同,详见vector容器的插入与删除。

list.splice() 方法:

和 insert() 成员方法相比,splice() 成员方法的作用对象是其它 list 容器,其功能是将其它 list 容器中的元素添加到当前 list 容器中指定位置处。

语法格式功能
void splice (iterator position, list& src);position 为迭代器,用于指明插入位置;src 为另一个 list 容器。
此格式的 splice() 方法的功能是,将 src 容器中存储的所有元素全部移动当前 list 容器中 position 指明的位置处。
void splice (iterator position, list& src, iterator i);position 为迭代器,用于指明插入位置;src 为另一个 list 容器;i 也是一个迭代器,用于指向 src 容器中某个元素。
此格式的 splice() 方法的功能是将 src 容器中 i 指向的元素移动到当前容器中 position 指明的位置处。
void splice (iterator position, list& src, iterator first, iterator last);position 为迭代器,用于指明插入位置;src 为另一个 list 容器;[fist,last) 用于指定 src 容器中的某个区域。
此格式的 splice() 方法的功能是将 src 容器 [first, last) 范围内所有的元素移动到当前容器 position 指明的位置处。

list 容器底层使用的是链表存储结构,详见博客list的底层实现原理,splice() 成员方法移动元素的方式是,将存储该元素的节点从 list 容器底层的链表中摘除,然后再链接到当前 list 容器底层的链表中。这意味着,当使用 splice() 成员方法将 src 容器中的元素添加到当前容器的同时,该元素会从 src 容器中删除。

list<int>sample1{ 1,2,3,4 }, sample2{ 5,6,7 };
	sample1.splice(sample1.begin(), sample2);
	//sample1{5,6,7,1,2,3,4} 
	//sample2{ }
	sample2.splice(sample2.begin(), sample1, sample1.begin());
	//sample1{6,7,1,2,3,4} 
	//sample2{ 5 }
	sample2.splice(sample2.end(), sample1, sample1.begin(), sample1.end());
	//sample1{ } 
	//sample2{5,6,7,1,2,3,4}

注意:list容器迭代器为双向迭代器,不支持 p+i 或 p-i 操作,比较时不支持 > 、< 、>= 、<=运算符 ,各类迭代器用法详见迭代器类型

删除元素

成员函数功能
pop_front()删除位于 list 容器头部的一个元素。
pop_back()删除位于 list 容器尾部的一个元素。
erase()该成员函数既可以删除 list 容器中指定位置处的元素,也可以删除容器中某个区域内的多个元素。
clear()删除 list 容器存储的所有元素。
remove(val)删除容器中所有等于 val 的元素。
unique()删除容器中相邻的重复元素,只保留一份。
remove_if()删除容器中满足条件
  • erase() 和 remove()示例 :
list<char>sample{ 'a','b','c','d','e','f','g' };

	//erase
	sample.erase(--sample.end());
		//sample{'a','b','c','d','e','f'}
	sample.erase(--sample.end(), sample.end());//区间[start,end)
		//sample{'a','b','c','d','e'}

	//remove
	sample.remove('c');
		//sample{'a','b','d','e'}
  • unique() 示例:
//unique
	list<int>sample_int{ 1,2,1,2,3,4,5,5,5 };
	sample_int.unique();
		//sample_int{1,2,1,2,3,4,5}

	//unique与sort连用
	sample_int.sort();
	sample_int.unique();
		//sample_int{1,2,3,4,5}

unique() 函数还可自定义去重规则:

//二元谓词函数:自定义去重规则
bool demo(double first, double second)
{
	return (int(first) == int(second));
}
void main()
{
	list<double> mylist{ 1.1, 1.2, 2.2, 2.3, 3.1, 4.1 };
	mylist.unique(demo);
	 //mylist{1.1, 2.2, 3.1, 4.1}
}

规则可以用Lambda表达式以及函数对象的方式定义,要求返回值为bool型。若相邻两值满足规则,则去除重复值。

  • remove_if() 示例:

通过将自定义的谓词函数(不限定参数个数)传给 remove_if() 成员函数,list 容器中能使谓词函数成立的元素都会被删除。

list<int> mylist{ 15, 16, 7, 17, 19, 9, 8};
	//删除 mylist 容器中能够使 lamba 表达式成立的所有元素。
mylist.remove_if([](int value) {return (value < 10); }); 
	//{15 16 17 19}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值