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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程