【学习笔记】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
输出结果
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的笔记。
双向链表#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的笔记。
相关文章推荐
- 【学习笔记】C++高级程序设计:STL:vector
- 【学习笔记】C++高级程序设计:STL标准模板库(2)
- 【学习笔记】C++高级程序设计:STL标准模板库
- 【学习笔记】C++高级程序设计:STL:Map 和 Multimap
- 【学习笔记】C++高级程序设计:STL:函数对象
- 【学习笔记】C++高级程序设计:STL:Set 和 Multiset
- C++ STL学习笔记四 list双向链表容器
- C++ STL学习笔记三 deque双端队列容器
- C++ STL学习笔记四 list双向链表容器
- STL学习笔记之 (五)容器 vector deque list 使用条件
- C++ STL学习笔记3--deque
- C++ STL学习笔记三 deque双端队列容器
- C++ STL 学习笔记 list,forward_list
- C++ Standard Stl -- SGI STL源码学习笔记(04) stl_deque && 初涉STL内存管理
- STL序列容器vector、deque、list和array学习笔记
- C++ STL学习笔记4--list
- c++学习笔记-------《c++自学通》第十二章 高级引用和指针
- JavaScript高级程序设计学习笔记1: 基础
- JavaScript高级程序设计学习笔记3: Math对象比较常用的几个方法
- <<SQL Server 2005 高级程序设计>> 学习笔记(2)