0

マップには 2 つのレイヤーがあり、2 番目のレイヤーはキューを指しています。キュー (およびマップ) から特定の数のアイテムを抽出したいのですが、適切な場所にブレーク/リターン/出口 (この場合はどれを使用すればよいかわかりません) を挿入するのに問題があるようです。 .

これはコードです:

#include <iostream>
#include <queue>
#include <map>

using namespace std;

int main()
{
    typedef std::queue<int> MessageQueue;
    typedef std::map<int, MessageQueue> PriorityMap;
    typedef std::map<int, PriorityMap> ClientMap;

    ClientMap clients;

    int priorities = 7;

    clients[10][1].push(1);
    clients[10][1].push(2);
    clients[10][5].push(3);
    clients[10][7].push(3);

    for (int j = 1; j<3; j++) //this determines how many times an element will be 'popped' from a queue
    {
        while (!clients[10].empty())
        {
            for (int i = priorities; i > 0; i--)
            {
                while (clients[10].find(i) != clients[10].end())
                {
                    cout << "priority " << i << endl;
                    cout << clients[10][i].front() << endl;
                    clients[10][i].pop();

                    if (clients[10][i].empty())
                        clients[10].erase(i);

                }

            }

            break; //I don't know where this should go in order for the while loop to stop executing after an element has been popped
        }

    }

    return 0;
}

この結果で

priority 7
3
priority 5
3
priority 1
1
priority 1
2

しかし、私が代わりに望む結果は

priority 7
3
priority 5
3
4

2 に答える 2

1

mainメソッドのコンテキストでは、exit基本return同じことを行います。どちらも、ループの途中で行うことはお勧めしません。

私の推奨事項:

bool done = false;
for (...; ... && !done; ...)
{
   while (... && !done)
   {
      ...
      done = true;
      ...
   }
}

または、問題のコンテキストでは:

int count = 2;
for (int j = 1; j<3 && count > 0; j++)
{
   while (!clients[10].empty() && count > 0)
   {
      for (int i = priorities; i > 0 && count > 0; i--)
      {
         while (clients[10].find(i) != clients[10].end() && count > 0)
         {
            ...
            count--;
            ...
         }
      }
   }
}

&& countの代わりにできることは知っています&& count > 0が、後者の方が読みやすいです。

于 2013-03-13T07:11:49.563 に答える
0

外側のループの代わりに、カウンターと を使用しますgoto

int countRemoved = 0;
while (!clients[10].empty())
{
    for (int i = priorities; i > 0; i--)
    {
        while (clients[10].find(i) != clients[10].end())
        {
            cout << "priority " << i << endl;
            cout << clients[10][i].front() << endl;
            clients[10][i].pop();
            if (clients[10][i].empty())
               clients[10].erase(i);
            if( ++countRemoved == 2 ) goto stop;
       }
    }
}
stop:
于 2013-03-13T07:11:36.830 に答える