1.容器类的是容纳、包含一组元素或元素集合的对象
2.容器的基本功能和分类
顺序容器
array(数组)、vector(向量)、deque(双端队列)、forward_list(单链
表)、list(列表)
(有序)关联容器
set(集合)、multiset(多重集合)、map(映射)、multimap(多重映射)
无序关联容器
unordered_set (无序集合)、unordered_multiset(无序多重集合)
unordered_map(无序映射)、unorder_multimap(无序多重映射)
3.容器的通用功能
用默认构造函数构造空容器
支持关系运算符:==、!=、<、<=、>、>=
begin()、end():获得容器首、尾迭代器
clear():将容器清空
empty():判断容器是否为空
size():得到容器元素个数
s1.swap(s2):将s1和s2两容器内容交换
相关数据类型(S表示容器类型)
S::iterator:指向容器元素的迭代器类型
S::const_iterator:常迭代器类型
对可逆容器的访问STL为每个可逆容器都提供了逆向迭代器,逆向迭代器可以通过下面的成员函数得到:
rbegin() :指向容器尾的逆向迭代器
rend():指向容器首的逆向迭代器
逆向迭代器的类型名的表示方式如下:
S::reverse_iterator:逆向迭代器类型
S::const_reverse_iterator:逆向常迭代器类型
随机访问容器支持对容器的元素进行随机访问
s[n]:获得容器s的第n个元素
4.顺序容器的接口
构造函数
赋值函数
assign
插入函数
insert, push_front(只对list和deque), push_back,emplace,
emplace_front
删除函数
erase , clear , pop_front ( 只 对 list 和 deque ) , pop_back ,
emplace_back
首尾元素的直接访问
front,back
改变大小
resize
顺序容器的基本操作举例:
#include <iostream>
#include <list>
#include <deque>
#include <iterator>
using namespace std;
template <class T>
void printContainer(const char *msg,const T&s)
{
cout<<msg<<":";
copy(s.begin(),s.end(),ostream_iterator<int>(cout," "));
cout<<endl;
}
int main()
{
int x;
deque<int> s;
for(int i=0;i<10;i++)
{
cin>>x;
s.push_front(x);
}
printContainer("deque at first",s);
list<int> l(s.rbegin(),s.rend());
printContainer("list at first",l);
list<int>::iterator iter=l.begin();
while(iter!=l.end())
{
int v=*iter;
iter=l.erase(iter);
l.insert(++iter,v);
}
printContainer("list at second",l);
s.assign(l.begin(),l.end());
printContainer("deque at second",s);
return 0;
}
例3:奇偶排序
先按照从大到小顺序输出奇数,再按照从小到大顺序输出偶数
#include <deque>
#include <iterator>
#include <vector>
using namespace std;
int main()
{
istream_iterator<int> m1(cin),m2;
vector<int> s1(m1,m2);
sort(s1.begin(),s1.end());
deque<int> s2;
for(vector<int>::iterator iter=s1.begin();iter!=s1.end();++iter)
{
if(*iter%2==0)
s2.push_back(*iter);
else
s2.push_front(*iter);
}
copy(s2.begin(),s2.end(),ostream_iterator<int>(cout," "));
cout<<endl;
return 0;
}
例4:细胞分裂模拟
#include <iostream>
#include <list>
#include <deque>
#include <iterator>
#include <vector>
#include<queue>
#include <string.h>
using namespace std;
const int SPLIT_TIME_MIN=500;
const int SPLIT_TIME_MAX=2000;
class Cell;
priority_queue<Cell> cellQueue;
class Cell{
private:
int id;
static int count;
int time;
public :
Cell(int birth):id(count++)
{
time=birth+(rand()%(SPLIT_TIME_MAX-SPLIT_TIME_MIN))+SPLIT_TIME_MIN;
cout<<"id:"<<getId()<<" "<<"time :"<<time<<endl;
}
int getId() const{return id;}
int getSplitTime() const{return time;}
bool operator < (const Cell& s) const //这里是自定义类型,用来确定那个优先级高,时间越小优先级越高
{ return time > s.time; }
void split() const
{
Cell child1(time),child2(time);
cout<<time<<"s.Cell#"<<id<<"split to #"<<child1.getId()<<"and#"<<child2.getId()<<endl;
cellQueue.push(child1);
cellQueue.push(child2);
}
};
int Cell::count=0;
int main()
{
srand(static_cast<unsigned>(time(0)));
int t;
cout<<"Simulation Time:";
cin>>t;
cellQueue.push(Cell(0));
while(cellQueue.top().getSplitTime()<=t)
{
cellQueue.top().split();
cellQueue.pop();
}
return 0;
}