queue适配器,遵守FIFO先入先出的规则,能够很好地模仿现实生活中的排队行为,下面就让我们通过queue适配器模拟用户到银行存取钱活动。
情景分析:
固定生成5名用户,随机生成他们的名字和目的,然后进行动态统计,排队完成所有银行活动。
#include<iostream>
#include<queue>
#include<random>
#include<unordered_map>
#include<chrono>
using namespace std;
/*queue适配器模拟银行活动*/
unordered_map<string,int> cost_time{
{"存钱",5}, //存钱慢一点
{"取钱",3}, //取钱最快
{"其他",8} //非自主活动耗时长一点
};
const string aim[3] = {"存钱", "取钱", "其他"};
/*生成随机数 - 使用时间种子增强随机性*/
static random_device rd;
static mt19937 gen(rd() ^ chrono::steady_clock::now().time_since_epoch().count());
// 使用多个专门的分布器
uniform_int_distribution<int> customer_count_dist(5, 15); // 顾客数量
uniform_int_distribution<int> name_len_dist(3, 8); // 名字长度
uniform_int_distribution<int> letter_dist(0, 25); // 字母索引
uniform_int_distribution<int> task_dist(0, 2); // 任务类型
class user
{
public:
user(const string& s1, const string& s2) : name(s1), m_aim(s2) {}
string name;
string m_aim;
};
void test()
{
queue<user> bank;
/*创建随机顾客*/
cout << "生成5个顾客\n\n";
for(int i = 0; i < 5; ++i)
{
string t_name;
string t_task;
/*生成名字 - 确保只有英文字母*/
int name_length = name_len_dist(gen);
for(int j = 0; j < name_length; ++j)
{
t_name += 'a' + letter_dist(gen);
}
/*目的*/
t_task = aim[task_dist(gen)];
/*入队*/
bank.push(user(t_name, t_task));
cout << "顾客 " << t_name << " 加入队列,办理" << t_task << "业务\n";
}
cout << "\n=== 开始办理业务 ===\n";
while(!bank.empty())
{
if(bank.size() != 1)
{
cout << "---------------------------------------\n";
cout << "目前有 " << bank.size()-1 << " 人在排队\n";
cout << "当前是【" << bank.front().name << "】在办理" << bank.front().m_aim << "业务\n";
cout << "需要 " << cost_time[bank.front().m_aim] << " 分钟\n";
cout << "---------------------------------------\n\n";
}
else
{
cout << "---------------------------------------\n";
cout << "目前有 " << bank.size()-1 << " 人在排队\n";
cout << "请【" << bank.front().name << "】前去办理" << bank.front().m_aim << "业务\n";
cout << "---------------------------------------\n";
}
bank.pop();
}
cout << "\n所有业务办理完成!\n";
}
int main() {
test();
return 0;
}代码编译如下:

通过queue适配器,我们成功模拟出银行活动线程,读者也快试试吧!
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程