C++——STL操作(一)——List

最基本的操作是增加、删除、修改、查询。

首先包头文件,还有命名空间否则无法使用

#include <list> 
using namespace std;

1、增加

list<int> list_a;
//往尾巴添加
for(int i = 0; i < 10; i++)
{
	list_a.push_back(i);
}
//往头部添加
for(int i = 0; i < 10; i++)
{
	list_a.push_front(i);
}
//往中间添加
list<int>::iterator it = list_a.begin(); //迭代器
advance(it, 2);            //移动到第二位
int data = 20;
list_a.insert(it, data);
//添加2个 相同的 data
list_a.insert(it, 2, data); 

2、删除

pop_back 剔除尾巴 和 pop_front 剔除开头

注意加上限制条件 判定list是否为空,否则list会越界

如果要删除达到某个条件的结点,利用iterator迭代器操作。

我上网查过资料,应该是没有人有贴出正确且高效的代码,以下代码是我自己亲身试验研究过的

(欢迎大家分享自己的成果来讨论。)

void main()
{
	list<int> v;
	static int num = 0;
	generate_n(back_inserter(v), 10, []()->int { return num++;});//生成存储值为0~9的容器
	
        list<int>::iterator it = v.begin();
	for (; it != v.end();)
	{
		if (*it < 11)//删除条件
		{
			//vector<int>::iterator tmp = [=]()mutable ->vector<int>::iterator {return it++;}();
			list<int>::iterator tmp = it;
			if (it == v.begin())    //如果删除结点是头结点
			{
				v.erase(it);        //erase删除当前结点
				it = v.begin();     //从头开始遍历
				continue;
			}
			else                    //如果删除的是中间结点
			{
				tmp = prev(it, 1);    //tmp设置成当前结点前一个
				v.erase(it);          //将当前结点删除
				it = tmp;		      //erase后it会变成当前结点的下一个,会被tmp结点覆盖,称为没有意义的指针,需要手动将当前结点指向tmp。
			}	
		}	
		it++;    //将当前结点向后推一位
	}
	system("pause");
}

3.修改

list<int>::iterator it = v.begin();
for (; it != v.end();)
{
    (*it) = 5; //利用迭代器指针修改值

}

4.查询

和修改大同小异,也是利用迭代器iterator。

5.排序

bool compare_int(int &a, int &b)
{
	return a > b; // > 是降序 < 是升序
}
void fun(int x)
{
	cout << x << endl;
}
void main()
{
	list<int> a;
	a.push_back(5);
	a.push_back(2);
	a.push_back(3);
	a.sort(compare_int);

	for_each(a.begin(), a.end(), fun);

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值