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适配器模拟银行活动

通过queue适配器,我们成功模拟出银行活动线程,读者也块试试吧!

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)