【学习笔记】C++高级程序设计:STL:List 和 deque

本文详细介绍了C++ STL中的List容器,强调了其作为双向链表的特性,如常数时间的插入和删除,但不支持随机访问。List特有的8个成员函数包括Push_front、Pop_front、Sort等。List的sort函数不支持STL通用sort,且迭代器不支持随机访问。此外,文章也提及了Deque容器,它是双向队列,结合了vector和list的特点,支持push_front和pop_front操作。
摘要由CSDN通过智能技术生成

List容器

双向链表#include <list>

在任何位置插入和删除都是常数时间

不支持根据下标随机存取元素

具有所有顺序容器都有的成员函数

 

List容器还支持的8个成员函数:

1、Push_front() :在链表最前面插入

2、Pop_front():删除链表最前面的元素

3、Sort():排序(list不支持STL算法sort,因为不支持随机访问迭代器

4、Remove():删除和指定值相等的所有元素

5、Unique():删除所有和前一个元素相同的元素

6、Merge():合并两个链表,并清空被合并的链表

7、Reverse():颠倒链表,逆序

8、Splice():在指定位置前面插入另一链表中的一个或多个元素,并在另一链表中删除被插入的元素

 

List容器的sort函数

List容器的迭代器不支持完全随机访问

不能用标准库中的sort函数对它进行排序

List自己的sort成员函数

List<T> classname

Classname.sort(compare); //compare函数可以自己定义

Classname.sort(); //无参数版本,按照<排序

List容器只能使用双向迭代器

不支持大于/小于比较运算符,[]运算符和随机移动(即类似“list的迭代器+2”的操作)

 

例子程序4

#include <list>
#include <iostream>
#include <algorithm>
using namespace std;

class A{
	//定义类A,并以友元重载<.==,<< 
	private:
		int n;
	public:
		A(int n_){
			n=n_;
		}
		friend bool operator < (const A &a1,const A &a2);
		friend bool operator == (const A &a1,const A &a2);
		friend ostream &operator <<(ostream &o,const A &a);
}; 

bool operator< (const A &a1,const A &a2){
	return a1.n<a2.n;
} 

bool operator ==(const A &a1,const A &a2){
	return a1.n==a2.n;
}

ostream &operator <<(ostream &o, const A &a){
	o<<a.n;
	return o;
}

//定义函数模板PrintList,打印列表中的对象
template<class T>
void PrintList(const list<T> & lst){
	int tmp = lst.size();
	if(tmp > 0){
		typename list<T>::const_iterator i;
		for(i=lst.begin();i!=lst.end();i++){
			cout<<*i<<",";
		}
	}
} 
//与其他顺序容器不同,list容器只能使用双向迭代器,
//因此不支持大于/小于比较运算符,[]运算符 和随机移动
//typename用来说明list<T>::const_iterator是个类型
//在VS中不写也可以


int main(){
	list<A> lst1,lst2;
	lst1.push_back(1);
	lst1.push_back(3);
	lst1.push_back(2);
	lst1.push_back(4);
	lst1.push_back(2);
	lst2.push_back(10);
	lst2.push_front(20);
	lst2.push_back(30);
    lst2.push_back(30);
	lst2.push_back(30);
	lst2.push_front(40);
	lst2.push_back(40);
	cout<<"1)";
	PrintList(lst1);
	cout<<endl;
	cout<<"2)";
	PrintList(lst2);
	cout<<endl;
	lst2.sort();
	cout<<"3)";
	PrintList(lst2);
	cout<<endl;
	
	lst2.pop_front();
	cout<<"4)";
	PrintList(lst2);
	cout<<endl;
	
	lst1.remove(2); //删除所有和A(2)相等的元素
	cout<<"5)";//Remove():删除和指定值相等的所有元素
	PrintList(lst1);//lst1:1,3,2,4,2 -> 1,3,4  
	cout<<endl;
	
	lst2.unique();//Unique():删除所有和前一个元素相同的元素 
	cout<<"6)";
	PrintList(lst2);
	cout<<endl;
	
	lst1.merge(lst2); //合并lst2到lst1并清空lst2
	cout<<"7)";
	PrintList(lst1);
	cout<<endl;
	
	cout<<"8)";
	PrintList(lst2);
	cout<<endl;
	
	lst1.reverse();
	cout<<"9)";
	PrintList(lst1);
	cout<<endl;
	//此时lst1:40,30,20,4,3,1, 
	lst2.push_back(100);
	lst2.push_back(200);
	lst2.push_back(300);
	lst2.push_back(400);
	//此时lst2:100,200,300,400 
	list<A>::iterator p1,p2,p3;
	p1=find(lst1.begin(),lst1.end(),3); 
	p2=find(lst2.begin(),lst2.end(),200);
	p3=find(lst2.begin(),lst2.end(),400);
	lst1.splice(p1,lst2,p2,p3);
	//Splice():在指定位置前面插入另一链表中的一个或多个元素,
	//并在另一链表中删除被插入的元素
	//在p1之前,插入区间[p2,p3),并从lst2中删除[p2,p3)
	//因为是前闭后开,所以是[200,400)->>200,300,不应包括400 
	cout<<"11)";
	PrintList(lst1);
	cout<<endl;
	cout<<"12)";
	PrintList(lst2);
	cout<<endl; 
	return 0;	
	
}
 
 
 


输出结果

1)1,3,2,4,2,

2)40,20,10,30,30,30,40,

3)10,20,30,30,30,40,40,

4)20,30,30,30,40,40,

5)1,3,4,

6)20,30,40,

7)1,3,4,20,30,40,

8)

9)40,30,20,4,3,1,

11)40,30,20,4,200,300,3,1,

12)100,400,

 

 

Deque容器

双向队列

必须包含头文件#include<deque>

所有适用于vector的操作->都适用于deque

Deque还有push_front(将元素插入到容器的头部)和pop_front(删除头部的元素)操作。

更多了解,可以参考我的上一篇关于vector的笔记。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值