您的位置:首页 > 编程语言 > C语言/C++

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

2014-08-06 19:04 701 查看
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的笔记。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: