//第二十三模板 18.2列表容器 //列表容器list是个标准模板库容器类 /*#include <iostream> #include <list> using namespace std; typedef list<int> List; int main() { List ll; List::iterator p; //list类的迭代器方法iterator,并声明了一个迭代器p,可以将其看作是一个归一化的指针 //也可锦成List::const_iterator p; //const_iterator p表示迭代器p指向的是一个常量,它的值是不可修改的 for(int i=1; i<10;++i){ ll.push_back(i*5); } for(p=ll.begin(); p!=ll.end(); ++p) { cout<<*p<<" "; } cout<<endl; return 0; }*/ /* list类还有其它成员函数 assign() 给list赋值 back() 返回最后一个元素 begin() 返回指向第一个元素的迭代器 clear() 删除所有元素 empty() 如果list是空的则返回true end() 返回末尾的迭代器 erase() 删除一个元素符号 front() 返回第一个元素 get_allocator() 返回list的配置器 insert() 插入一个元素到list中 max_size() 返回list能容红领巾的最大元素数量 merge() 合并两个list pop_back() 删除最后一个元素 push_back() 在list的末尾添加一个元素 push_front() 在list的头部添加一个元素 rbegin() 返回指向第一个元素的逆向迭代器 remove() 从list删除元素 remove_if() 指指定条件删除元素 rend() 指向list末尾的逆向迭代器 reverse() 把list的元素倒转 size() 返回list中的元素个数 sort() 给list排序 splice() 将第二个list连接到指定位置 swap() 交换两个list unique() 删除list中重复的元素 */ /* #include <iostream> #include <list> #include <ostream> using namespace std; typedef list<int> List; void show(List&one, List::iterator pos) { for(pos=one.begin(); pos!=one.end(); ++pos){ cout<<*pos<<" "; } } int main() { List one; int num[6]={0,1,2,3,4,5}; one.insert(one.begin(), num,num+6); List::iterator p; show(one,p); cout<<endl<<"倒转所有元素"<<endl; one.reverse(); show(one,p); one.sort(); cout<<endl<<"按升序排列所有元素"<<endl; //创建一个输出流对像pp,它将接受一个int的变量,并以空字符作为间隔符 //ostream_iterator<int,char>pp(cout," "); //这句是创建一个什么东东 //copy(one.begin(),one.end(),pp); //cout<<endl; List two(2); cout<<"将list two的所有元素添添加到one的后面"<<endl; one.splice(one.end(),two); show(one,p); //copy(one.begin(),one.end(),pp); cout<<endl; cout<<endl<<"删除重复元素"<<endl; one.unique();//这里删除重复之后咱还有0 1 2 3 4 5 0呢? //unique()为什么不将一前面的0或者5后面的0删除掉呢 //这是因为unique()函数只能将相邻的重复元素合并为一个 show(one,p); cout<<endl; cout<<endl<<"删除为0的元素"<<endl; one.remove(0); show(one,p); cout<<endl; cout<<"清空所有元素"<<endl; one.clear(); show(one,p); system("pause"); return 0; }*/ //注意: insert与splice的区别,insert将list对像的副本插入到目标区域中,而splice则将该对像直接移到目标地址 //第二十三模板 18.3双向队列容器 deque // 双向队列(deque)和向量(vector)很相似,但是它允许在容器头部和尾部快速插入和删除,它也支持随机访问,但是效率比向量略低 /* Constructors() 创建一个新双向队列 Operators() 比较和赋值双向队列 assign() 设置双向队列的值 at() 返回指定的元素 back() 返回最后一个元素 begin() 返回第一个元素的迭代器 clear() 清空所有元素 empty() 判断双向队列是否为空(返回true时为空) end() 返因最末元素的迭代器(实指向最末元素的下一个位置) erase() 删除指定元素 front() 返回第一个元素 get_allocator() 返回双向队列的内存分配器 insert() 插入元素的双向队列中 max_size() 返回双向列能容纳的最大元素个数 pop_back() 移除最后一元素 pop_front() 删除头部的元素 push_back() 在最后添加一个元素 rbegin() 返回尾部的逆迭代器 rend() 返回起始的逆迭代器 resize() 改变双向队列的大小 size() 返回又向队列中元素的个数 swap() 和另一个双向队交换元素 */ // 2.4 队列 //队列模板类queue是一个适配器类,前面所学的ostream_iterator模板就是个适配器类,它让输出流能够将迭代器作为接口 //同样,队列模板类queue默认给双向队列容器deque提供队列接口 //什么是队列: //队列就是像整齐排列在电影院门口等候买票的队,新来人人要排列在队伍的最后面, //这称为FIFO, 即先入先出 堆栈是LIFO即后进行出 //所有方法如下 /*back() 返回最后一个元素 empty() 如果队列空则返回值 front() 返回第一个元素 pop() 删除第一个元素 push() 在末尾加入一个元素 size() 反队列元素的个数*/ //注意,要删除队首的元素,则需要首先调用front()函数获取第一全元素的信息,然后才能调用pop函数删除该元素,要在队尾加入一个元素,则首先调back()函数返回最后一个元素,然后调用push()函数在队尾加入一个元素 //2.5 优先队列 /* Priority Queues模板类是另一个适配器类,它支持的操作与队列模板类queue相同 empty() 如果优先队列为空,则返回值 pop() 删除第一个元素 push() 加入一个元素 size() 返回优先队列中拥有的元素的个数 top() 返回优先队列中的最高优先级的元素 */ //2.6 堆栈类 stack /* operator(== <= >= <> !=) 比较和分配堆栈 empty() 堆栈为空则返回真 pop() 移除栈顶元素(弹) push() 在栈顶增加元素(压) size() 返回栈中元素数目 top() 返回栈顶元素 */ /*#include <iostream> #include <stack> using namespace std; int main() { stack<int> s; for(int i=0; i<10; i++) { s.push(i); cout<<"当前压入元素为:"; cout<<"当前椎栈中元素数目前为:"<<s.size()<<endl; } cout<<endl<<"依次弹出栈栈机元素"<<endl; while(!s.empty()){ cout<<s.top()<<" "; s.pop(); } if(s.empty()){ cout<<endl<<endl<<"堆栈已空"<<endl; } system("pause"); return 0; }*/