C++ STL学习之四:序列式容器list深入学习

本文深入探讨了STL中的list数据结构,包括其环状双向链表特性,插入、删除操作的效率,迭代器使用限制,以及与vector、deque的区别。详细解释了list的操作函数,如生成、赋值、销毁、存取元素、插入删除等,并通过实例程序展示其实现。同时,阐述了list的非随机存取性质和对异常的处理方式。

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

在STL中list表示的是一种环状的双向链表(带头) ,相比vector需要维护start finish end_of_storage,list只需要维护一个node指针结点(头结点)就可以了。

    双向环状链表的初始过程如下:

1     node=getNode();//新建一个结点
2     node->next=node;//后一结点是node
3     node->pre=node;//前一结点是node

特点:1)环状双向链表,对于任何位置的元素插入或删除是常数时间

2)插入和接合不会使原有list迭代器失效

list迭代器:不能以普通指针为迭代器,使用bidirectional iterator

插入操作:本质是插入在…之前,新节点位于标示出插入点所指节点的前方,插入前的所有迭代器在插入后有效

list的内部结构和vector和deque截然不同,在很多方面都表现不同:

1、list不支持随机存取。所及既不提供下表操作符,也不提供at()函数。

2、任何位置上插入元素删除元素都很快。

3、插入和删除操作不会造成指向其他元素的pointers、references、iterators失效。

4、list对于异常的处理方式是:要么成功,要么什么都不发生。

5、不提供容量、空间重新分配等操作函数。

6、提供了一些函数专门用于移动元素。

list的操作函数

生成、赋值和销毁与序列式容器相同。

构造函数和析构函数:


非变动性操作


赋值


元素存取


一般来说,这些操作不会检查元素是否为空,所以程序员必须保证容器不为空。

迭代器相关函数

存取元素只能用迭代器。然而由于list不能随机存取,这些迭代器只是双向而非随机迭代器。所以凡是用到随机存取迭代器的算法(所有用来操作元素顺序的算法-特别是排序算法都归于此类)都不能调用。不过可以用list的成员函数sort()完成此功能。


元素的插入和删除



list提供deque的多余功能,还增加了remove()和remove_if()算法应用于list‘身上的特殊版本。这些成员函数比STL的remove算法更快,因为它们只进行内部指目标工作,无需估计元素。

要将所有与某值相等的元素删除,可以用如下语句(注意:确实是将这些元素删除了,而不是像vector那样只是某种移动而已)

  1. list<int> list1;  
  2. list1.remove(val);  
list还提供了其他一些成员函数,用来改变元素和区间的次序,或是重新串链。我们可以用他们来移动单一list里的元素,也可以移动两个list之间的元素(前提是list的型别一致)。




实例程序
#include<iostream>
#include<list>
#include<algorithm>
#include<iterator>
using namespace std;
void printList(const list<int> &list1,const list<int> &list2)
{
	cout<<"list1:";
	copy(list1.begin(),list1.end(),ostream_iterator<int>(cout," "));
	cout<<endl<<"list2:";
	copy(list2.begin(),list2.end(),ostream_iterator<int>(cout," "));
	cout<<endl<<endl;
}
int main(int argc,char *argv[])
{
	list<int> list1,list2;
	for(int i=10;i<20;i++)
	{
		list1.push_back(i);
		list2.push_front(i);
	}
	printList(list1,list2);

	list2.splice(list2.end(),list2,list2.begin());
	printList(list1,list2);

	list2.sort();
	printList(list1,list2);

	list2.unique();
	printList(list1,list2);

	list1.merge(list2);
	printList(list1,list2);
	return 0;
}

shenhuayu@shenhuayu-VirtualBox ~/src $ g++ stltest.cpp -g -o mystltest
shenhuayu@shenhuayu-VirtualBox ~/src $ ./mystltest
list1:10 11 12 13 14 15 16 17 18 19 
list2:19 18 17 16 15 14 13 12 11 10 

list1:10 11 12 13 14 15 16 17 18 19 
list2:18 17 16 15 14 13 12 11 10 19 

list1:10 11 12 13 14 15 16 17 18 19 
list2:10 11 12 13 14 15 16 17 18 19 

list1:10 11 12 13 14 15 16 17 18 19 
list2:10 11 12 13 14 15 16 17 18 19 

list1:10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 
list2:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值