0

クライアント メッセージを保持するmap<int, map<int, queue<string>>があります。最初のマップはメッセージ カテゴリ (1-7) を保持し、2 番目のマップはソース クライアントの ID (クライアントの '0s) を保持し、キューはメッセージ自体を保持します。

メッセージは、受信されるとキューにプッシュされます。

map<int, map<int, queue<string>>> msg_map; //map holding messages
//receive message from client
int msg = receive_fr_client(cli_id); //function to receive message from client
int msg_category = cat_check(msg); //function to process message attribute

msg_map[msg_category][cli_id].push(msg);

キューが空かどうかを確認するために、このネストされたマップを反復処理できる必要があります。基本的には、最上位のカテゴリのどのクライアントに送信するメッセージがあるかを知る必要があります。その後、1 つのクライアントを選択して (別のアルゴリズムを使用しますが、ここでは無関係なのでランダムに選択しています)、そこからのメッセージを処理します。

私は次のことを概念化しました:それを行うためのより良い方法はありますか? 私はVS2012で作業していますが、可能であればブーストから離れたいと思っています。

#include "stdafx.h"
#include <iostream>
#include <string>
#include <map>
#include <queue>
#include <vector>

using namespace std;

int main()
{
    map<int, map<int, queue<int>>> msg_map;
    msg_map[2][3].push(3);
    msg_map[3][4].push(5);
    msg_map[3][4].push(7);
    msg_map[3][7].push(9);
    msg_map[3][11].push(11);

    int count = 1;
    int rand_cli;

    for (int i=7; i>0 && count > 0 ; i--)
    {
        if (msg_map.find(i) != msg_map.end())
        {
            map<int, queue<int>>::iterator iter;
            vector<int> cli_index;

            for (iter = msg_map[i].begin(); iter != msg_map[i].end(); iter++)
            {
                if (!iter->second.empty())
                {
                    cli_index.push_back(iter->first);
                }
            }

            int index_size = cli_index.size();
            int rand_pos = rand() % index_size;
            rand_cli = cli_index[rand_pos];

            count--;
        }
    }

    cout << rand_cli;



    return 0;
}
4

0 に答える 0