c++容器之单链表和双向链表

由于最近要用单链表和双向链表所以这里总结一些常用的操作。

1.单链表

forward_list<int> a;//创建一个单向链表
	cout << a.max_size() << endl;//单链表保存的最大元素数目
	for (int i = 0; i < 10; i++)
	{
		a.push_front(i);//给单链表的首部添加元素,单链表不支持push_back
	}
	forward_list<int>::iterator be = a.begin();//获取迭代器
	forward_list<int>::iterator en = a.end();
	for (int i = 0; i < 9; i++)
	{
		cout << *be << endl;
		if (i == 5)
		{
			auto c=a.erase_after(be);//返回的迭代器指向删除元素的下一个
			cout << *be << endl;//be迭代器指向删除元素的前一个
			cout << *c << endl;
		}//删除一个元素
		be++;
	}
//a.pop_front(),单链表只支持删除首项元素

2.双链表

list<int> a;
	for (int i = 0; i < 10; i++)
	{
		a.push_back(i);//双链表支持放置在后面
	}
	auto be = a.begin();
	auto en = a.end();
	//en--;双链表支持尾后迭代器--
	be++;
	auto c=a.erase(be);
	//cout << *be << endl;//删除完元素后迭代器失效
	cout << *c << endl;//指向下一个元素
	a.pop_back();//删除尾元素
	a.pop_front();//删除首元素
        a.resize(15);//改变容器的大小

2019 6.10补充

在for循环里依靠迭代器删除删除双链表的元素时要牢记迭代器失效,例如下面这段代码

就会导致程序崩溃

for (auto be = e.begin(); be != e.end(); be++)//e是双向链表
	{
		if ((*be).a == 3)
		{
			e.erase(be);
		}
	}

我们可以使用以下的方式删除

for (auto be = e.begin(); be != e.end(); be++)//e是双向链表
	{
		if ((*be).a == 3)
		{
			auto c=e.erase(be);
			cout << (*c).a << endl;
			be = c;
		}
	}

至于单链表的话,这个容器有自己的erase_after操作,不会使迭代器失效

for (auto be = e.begin(); be != e.end(); be++)//e是单向向链表
	{
		if ((*be).a == 4)
		{
			e.erase_after(be);
		}
	}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值