0

キューの使用 (およびベクトルの実践) について学ぶために、簡単なコードをテストしています。

私はこのコードを書きました:

#include "stdafx.h"
#include <iostream>
#include <queue>

struct msgInfo //contains the attributes as gleaned from the original (IP) message
    {
        int age;
        std::string name;
    };

using namespace std;

int main ()
{
    vector<vector<queue<msgInfo>>> nodeInc; //container for messages
int qosLevels = 7; //priority levels
int nodes = 5; //number of nodes
vector<queue<msgInfo>> queuesOfNodes(qosLevels);

int i;
for (i=0; i<nodes; i++)
{
    nodeInc.push_back(queuesOfNodes);
}

msgInfo potato, tomato, domato, bomato;
potato.age = 2;
potato.name = "dud"; 
tomato.age = 3;
tomato.name = "bud"; 
domato.age = 4;
domato.name = "mud"; 
bomato.age = 5;
bomato.name = "pud"; 

nodeInc[2][2].push(potato);
nodeInc[2][2].push(tomato);
nodeInc[2][3].push(domato);
nodeInc[2][3].push(bomato);

for (int j = 0; j < 2; j++) //simple loop for testing: for each round, output the age of only one 'msgInfo'
{
    cout << j << endl;
    for (int k = (qosLevels-1); k >= 0; k--)
    {
        if (!nodeInc[2][k].empty())
        {
            cout << nodeInc[2][k].front().age << endl;
            nodeInc[2][k].pop();
            return 0;
        }
        else
            break;

    }
}

}

私が得る出力は

0
1

しかし、私が取得しようとしているのは

0
4
1
5

ここで何が間違っていますか?ロジックのどこが間違っているのかわかりません。ここでは、最高の優先度レベルに属する最初の 2 つの要素を出力する必要があるようです。ループを終了する方法に関係していると思います-基本的に、forループの各ラウンドで、「ポップ」する前に1つのmsgInfoの年齢のみを出力する必要があります-しかし、終了/リターン/ブレークを試しました動作していません。

編集

ノードからメッセージを受信して​​います。これらのメッセージは、属性 (ノードと優先度レベル) に従ってキューに入れる必要があります。これを行うために a を使用することvector<vector<queue<msgInfo>>>にしました -> 基本的にノード < 優先度レベル < メッセージのキュー > >. このコンテナーにアクセスするとき、一度に 1 つの msgInfo の経過時間を出力する必要があります。msgInfo は、最高の優先度レベルのキューの先頭になります。すべての優先度レベルが満たされるわけではないため、関連する要素を見つけるために、最高の優先度レベルから最低の優先度レベルまで反復する必要があります。

これらを一度に出力するループを設計する必要があります (ループの各ラウンド間で他の処理を行う必要があるため)。

4

2 に答える 2

0

あなたは何を期待しreturn 0、何をしbreakますか?

return 0関数全体を終了するmainため、空でないキューに遭遇するとプログラムは終了します。

break最も内側の囲みループ (つまりfor (i ...)) を終了します。つまり、現在のロジックは次のとおりです。

のそれぞれjについて0、次のことを1行います。

が空でない場合nodeInc[2][qosLevels - 1]は、最初に出力してプログラムを終了します。それ以外の場合は、これ以上is を試行せず、 next を実行しjます。

意図した動作が何であるかはわかりませんが、あなたが与えた「期待される出力」に基づいて、 に置き換えreturn 0、句を完全にbreak省略してください。else

于 2013-02-21T08:00:43.490 に答える
0

私が得ることができる最も近いものはこれです:

for (int j = 0; j < 2; j++) //simple loop for testing: for each round, output the age of only one 'msgInfo'
{
    cout << j << endl;
    for (i = (qosLevels-1); i >= 0; i--)
    {
        if (!nodeInc[2][i].empty())
        {
            cout << nodeInc[2][i].front().age << endl;
            nodeInc[2][i].pop();
            //return 0;  <--------DON'T return. this terminates the program
            break;
        }
        //else
        //    break;
    }
}

それは次を返します:

0
4
1
5

コメントに記載されているように、呼び出しreturn 0;はから戻りmain()、したがってプログラムを終了します(実際には平和的な終了のようなものです)。

于 2013-02-21T08:01:47.800 に答える