//第二十三模板 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;
}*/