STL之list 用法

List 容器的使用

list是C++标准模版库(STL,Standard Template Library)中的部分内容。实际上,list容器就是一个双向链表,

可以高效地进行插入删除元素。使用list容器之前必须加上<vector>头文件:#include<list>;list属于std命名

域的内容,因此需要通过命名限定:using std::list;也可以直接使用全局的命名空间方式:using namespace std;

构造函数

    list<int> c0; //空链表

  list<int> c1(3); //建一个含三个默认值是0的元素的链表

  list<int> c2(5,2); //建一个含五个元素的链表,值都是2

  list<int> c4(c2); //建一个c2的copy链表

  list<int> c5(c1.begin(),c1.end()); ////c5含c1一个区域的元素[_First, _Last)。

成员函数

c.begin()      返回指向链表第一个元素的迭代器。

c.end()      返回指向链表最后一个元素之后的迭代器。

c.rbegin()      返回逆向链表的第一个元素,即c链表的最后一个数据。

c.rend()      返回逆向链表的最后一个元素的下一个位置,即c链表的第一个数据再往前的位置。

c.assign(n,num)      将n个num拷贝赋值给链表c。

c.assign(beg,end)      将[beg,end)区间的元素拷贝赋值给链表c。

c.front()      返回链表c的第一个元素。

c.back()      返回链表c的最后一个元素。

c.empty()  判断链表是否为空。

c.size()      返回链表c中实际元素的个数。

c.max_size()      返回链表c可能容纳的最大元素数量。

c.clear()      清除链表c中的所有元素。

c.insert(pos,num)      在pos位置插入元素num。

c.insert(pos,n,num)      在pos位置插入n个元素num。

c.insert(pos,beg,end)      在pos位置插入区间为[beg,end)的元素。

c.erase(pos)    删除pos位置的元素。

c.push_back(num)      在末尾增加一个元素。

c.pop_back()      删除末尾的元素。

c.push_front(num)      在开始位置增加一个元素。

c.pop_front()      删除第一个元素。

resize(n)      从新定义链表的长度,超出原始长度部分用0代替,小于原始部分删除。

resize(n,num)            从新定义链表的长度,超出原始长度部分用num代替。

c1.swap(c2);      将c1和c2交换。

c1.merge(c2)      合并2个有序的链表并使之有序,从新放到c1里,释放c2。

c1.merge(c2,comp)      合并2个有序的链表并使之按照自定义规则排序之后从新放到c1中,释放c2。

c1.splice(c1.beg,c2)      将c2连接在c1的beg位置,释放c2

c1.splice(c1.beg,c2,c2.beg)      将c2的beg位置的元素连接到c1的beg位置,并且在c2中施放掉beg位置的元素

c1.splice(c1.beg,c2,c2.beg,c2.end)      将c2的[beg,end)位置的元素连接到c1的beg位置并且释放c2的[beg,end)位置的元素

remove(num)             删除链表中匹配num的元素。

remove_if(comp)       删除条件满足的元素,参数为自定义的回调函数。

reverse()       反转链表

unique()       删除相邻的元素

c.sort()       将链表排序,默认升序

c.sort(comp)       自定义回调函数实现自定义排序


测试代码

#include<list>
#include<iostream>
#include<algorithm>

using namespace std;

void print(int &data)
{
	cout<<"-->"<<data<<" ";
} 

int main(int argc, char **argv)
{
	list<int> link;
	list<int> link2;
	cout<<"list--size: "<<link.size()<<endl;
	link.push_back(5);
	link.push_back(8);
	link.push_front(6);
	link.push_front(2);
	link.push_back(3);
	
	link2.push_back(1);
	link2.push_back(10);
	link2.push_back(9);
	link2.push_back(7);
	link2.push_back(4);
	
	
	list<int>::iterator it;
	link.erase(link.begin());
	for(it = link.begin(); it != link.end();++it)
		print(*it);
	cout<<endl;
	link.push_front(3);
	link.push_back(2);
	link.remove(5);
	
	cout<<"list--size: "<<link.size()<<endl;
	link.sort();
	for_each(link.begin(),link.end(),print);
	cout<<endl;
	link2.sort();
	for_each(link2.begin(),link2.end(),print);
	cout<<endl;
	
	link.merge(link2);
	for_each(link.begin(),link.end(),print);
	cout<<endl;
	
	
	link.unique();
	link.reverse();
	for_each(link.begin(),link.end(),print);
	cout<<endl;
	
	return 0;
}









### C++ STL List 容器删除元素 #### 使用 `erase` 函数 对于C++ STL中的`list`容器,可以使用成员函数`erase`来移除指定位置的元素。此函数接受迭代器作为参数并删除该迭代器指向的位置上的项目[^2]。 ```cpp #include <iostream> #include <list> int main() { std::list<int> myList = {1, 2, 3, 4, 5}; // 创建一个迭代器指向第三个元素 (即值为3) auto it = myList.begin(); advance(it, 2); // 删除第三个元素 myList.erase(it); // 输出剩余列表项 for(auto& elem : myList){ std::cout << elem << " "; } } ``` 上述代码展示了如何通过创建指向目标位置的迭代器,并将其传递给`erase`来进行单个元素的移除操作。 #### 移除最后面的一个元素 要从`list`中去除最末端的一项,则可以直接调用`pop_back()`方法实现这一点。实际上,在某些标准库实现在内部会利用`erase`配合`end()`来完成这一功能。 ```cpp std::list<int>::iterator popBackExample(std::list<int>& lst) { if (!lst.empty()) { return lst.erase(--lst.end()); } return lst.end(); // 如果为空则返回结束迭代器 } ``` 这段例子说明了当执行`pop_back`时发生的实际过程:先定位到最后一个有效元素之前的位置再做清除处理。 #### 清空整个链表 如果目的是清空整个`list`对象内的全部内容,那么应该采用`clear()`成员函数;这将高效地释放所有关联资源而不必逐一遍历各个节点去单独销毁它们[^1]。 ```cpp myList.clear(); ``` 以上就是几种常见的用于管理`list`内存储单元生命周期的操作手段介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值