功能:
一种细胞在诞生(即上次分裂)后会在500~2000秒内分裂为两个细胞,每个细胞又按照同样的规律继续分裂。
本程序模拟了细胞分裂的过程,输出了每个细胞分裂的时间。
环境:VS2010。
控制台应用程序。
程序:
// cell_split_simulation_use_priority_queue.cpp : 定义控制台应用程序的入口点。
//细胞分裂模拟,输出每个细胞分裂的时间
//一种细胞在诞生(即上次分裂)后会在500~2000秒内分裂为两个细胞,
//每个细胞又按照同样的规律继续分裂。
//
#include "stdafx.h"
#include<queue>
#include<iostream>
#include<cstdlib> //cstdlib是C++里面的一个常用函数库, 等价于C中的<stdlib.h>。提供一些函数与符号常量。
#include<ctime>
using namespace std;
const int SPLIT_TIME_MIN=500;
const int SPLIT_TIME_MAX=2000; //细胞分裂最短和最长时间
class Cell;
priority_queue<Cell>cellQueue;
class Cell //细胞类
{
private:
static int count; //细胞总数
int id; //当前细胞编号
int time; //细胞分裂时间
public:
Cell(int birth):id(count++) //birth为细胞诞生时间
{
//初始化,确定该细胞分裂时间
time=birth+(rand()%(SPLIT_TIME_MAX - SPLIT_TIME_MIN)) + SPLIT_TIME_MIN;
}
int getId()const
{
return id; //得到细胞编号
}
int getSplitTime()const
{
return time; //得到当前细胞分裂时间
}
bool operator < (const Cell & s) const
{
return time > s.time; //定义“<”
}
void split() //细胞分裂
{
Cell child1(time),child2(time); //建立两个子细胞
cout<<time<<"s : Cell #"<<id<<" splits to #"<<child1.getId()<<"and #"<<child2.getId()<<endl;
cellQueue.push(child1);//将第一个细胞压入优先级队列
cellQueue.push(child2);//将第二个细胞压入优先级队列
}
};
int Cell::count = 0;
int _tmain(int argc, _TCHAR* argv[])
{
srand(static_cast<unsigned>(time(0)));
int t; //用户定义模拟细胞分裂的时间长度
cout<<"Stimulation time:";
cin>>t;
cellQueue.push(Cell(0)); //将第一个细胞压入优先级队列
while(cellQueue.top().getSplitTime() <= t)
{
cellQueue.top().split(); //模拟下一个细胞的分裂
cellQueue.pop(); //将刚刚分裂的细胞弹出
}
int a;
cin>>a; //防止程序闪退
return 0;
}
运行结果:

补充:
随机函数:rand()
时间函数:time() ,获得一个以整数表示的当前时间(精确到秒)。
每个细胞按照产生的顺序从小到大编号,
每个细胞对象有一个分裂时间:诞生时间+随机的时间差
细胞类Cell的“<”运算符:按照细胞分裂时间的反序定义的,即如果a对象比b象分裂时间要晚,那么就有a<b。