2011-12-07 43 views
2
include <queue> 
using namespace std; 
char msg[1000]; 

ここで、この種のmsgを5個格納できるキューが必要です。したがって、サイズ5のキューには5つの文字配列が含まれ、各配列には最大1000文字まで使用できます。文字配列の配列

キューを開始するにはどうすればよいですか?私はこれを試みたが、うまくいかなかった。

char msg[1000]; 
queue<msg> p; 
+0

どうしたのですか?コンパイラエラー? –

+1

'std :: string'はきちんとしています。 – AusCBloke

+0

@ JoeMcGrathありがとうございました。私は 'dequeをしました QUEUE;一方、(1){char msg [1000]; msg = newString(); QUEUE.push(msg); } '。そして、 'msg'と同じものを参照しているので、キュー内のすべての要素が同じであることがわかりました。どうすれば問題を解決できますか? –

答えて

1

編集:std :: vectorが良い選択かもしれませんが、文字配列のサイズを調べてみました。バイナリデータを格納するためにそれを使用している場合は、おそらくstd::queue< std::vector <char> > msgsが最適です。

変数を型として使用することはできません。あなたは文字ポインタのキューを持つことができます。

#include <iostream> 
#include <queue> 

std::queue <char*> msgs; 

int main() 
{ 
    char one[50]="Hello"; 
    msgs.push(one); 
    char two[50]="World\n\n"; 
    msgs.push(two); 

    msgs.push("This works two even though it is a const character array, you should not modify it when you pop it though."); 


    while(!msgs.empty()) 
    { 
     std::cout << msgs.front(); 
     msgs.pop(); 
    } 

return 1; 
} 

std :: stringを使用して間違いを避けることもできます。 char*を使用して、キューにメッセージを追加する機能を使用する場合は、キューを処理したときに削除することを覚えておくよりも、スタックに入れることはできません(つまり、newまたはmallocで作成する必要があります)。グローバル空間にあるか、スタック上にあるのか、あるいは新しいもので作られたのかを簡単に判断する方法はありません。正しく処理されないと、未定義の動作やメモリリークにつながります。 std::stringは、これらの問題をすべて回避します。

#include <iostream> 
#include <queue> 
#include <string> 

std::queue <std::string> msgs; 

int main() 
{ 

    msgs.push("Hello"); 
    msgs.push("World"); 

    while(!msgs.empty()) 
    { 
     std::cout << msgs.front(); 
     msgs.pop(); 
    } 

return 1; 
} 

それだけで5標準メッセージであれば、const char*はまともな選択であろうが、彼らは常に同じメッセージであれば、あなたが望むメッセージを参照してください整数の待ち行列を考慮する必要があります。この方法で、より多くのアクションを関連付けることができます。しかし、あなたはオブジェクトのキューを考えることもできます。

#include <iostream> 
#include <queue> 

std::queue <int> msgs; 

int main() 
{ 

    msgs.push(1); 
    msgs.push(2); 

    while(!msgs.empty()) 
    { 
     switch(msgs.front()) 
     { 
     case 1: 
      std::cout << "Hello"; 
     break; 
     case 2: 
      std::cout << "World"; 
     break; 
     default: 
      std::cout << "Unkown Message"; 
     } 

     msgs.pop(); 
    } 

    return 1; 
} 
+0

ありがとうたくさん!それは動作します –

+0

ありがとう。私は 'dequeをしました QUEUE;一方、(1){char msg [1000]; msg = newString(); QUEUE.push(msg); } '。そして、 'msg'と同じものを参照しているので、キュー内のすべての要素が同じであることがわかりました。どうすれば問題を解決できますか? –

+0

私はnewString()が何であるか分かりませんが、msgはちょうど私のchar *でなければなりません。この場合は...あなたの質問にnewStringが何をしているのか投稿できますか? –

3
struct msg { 
    char data[1000]; 
}; 
queue<msg> p; 
+1

私は最初に 'typedef char msg [1000];を書いていましたが、Tomalakが述べたように、それはSTLコンテナでは動作しません。 'std :: string'や' std :: vector'を使ったものは、データの性質によってはより効率的かもしれませんが、それを構造体でラップするとそれが修正されます。 – smparkes

+3

構造体を作成する代わりに、 'std :: array 'を使うことができます。基本的に同じことをするだけでなく、便利な機能も提供します。 –

+0

ノート@BenjaminLindleyをありがとう。 TR1/C++ 11の一部私は最新ではありませんでした。 – smparkes

2

msgアレイ、ではないタイプです。配列はコピーできないので、これはとにかく動作しません。代わりにstd::queue<std::string>はなぜですか?

+0

あなたの提案に感謝しますが、今回はchar *を使用しなければなりませんでした –

+0

@JJLiu:なぜですか?それは愚かです。 –

0

まず、インクルードステートメントの前に「#」記号が必要です。

第2に、キューを宣言するときに、 'msg'のような変数名ではなく、角括弧(ケース 'char *')に含めるタイプを入れます。

+0

匿名のダウン者に対抗するため+1。私が見る限り、この答えには何も間違っていません。 –

+0

ありがとう、答えは良いです –

+0

@ AlfP。Steinbach:私は基本的に同意します。ただし、他人の投票権を「取り消す」ことはあなたの仕事ではありません。これは実際にアップフォートにふさわしい「素晴らしい」答えですか? –