STL 容器(一)

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;
}


猜你喜欢

转载自blog.csdn.net/qq_38211852/article/details/80678536
今日推荐